JavaScript-闭包

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    //有不少开发人员总是搞不清楚匿名函数和闭包这两个概念,因此经常混用
    //闭包是指有权访问另一个函数作用域中的变量的函数。
    //创建闭包的常见方式,就是在一个函数内部创建另一个函数
    function fun(value){
        return function(obj1,obj2){
            var num1 = obj1[value];
            var num2 = obj2[value];
            if(num1>num2){
                return 1; 
            }else if(num1<num2){
                return -1;
            }else{
                return 0;
            }
        }
    }
    var fun1 = fun('哈哈');//创建函数
    console.log(fun1);//输出一个匿名函数
    var msg = fun1({'哈哈':2},{'哈哈':1});//调用函数
    console.log(msg);//输出1
    fun1 = null;//解除对匿名函数的引用,以便释放内存


    //闭包与变量
    /*作用域链的配置机制引出了一个值得注意的副作用,即闭包只能取得包含函数 
      中任何变量的最后一个值。别忘记了闭包所保存的是整个变量对象,而不是某
      个特殊的变量。
    */
   function createFun(){
       var arr = new Array();
       for(var i=0;i<10;i++){
           arr[i] = function(){
               return i;
           };
       }
       return arr;
   }
   var fun1 = createFun();
   console.log(fun1);//输出一个函数数组
   for(var i=0;i<fun1.length;i++){
       console.log(fun1[i]());//输出10次10
   }
   /*
   *    表面上看,似乎每个函数都应该返回自己的索引值,即位置0的函数返回0
        位置1的函数返回1,以此类推。但实际上,每个函数都会返回10。因为每个
        函数的作用域链中都保存着creatFun()函数的活动对象,所以它们引用的都是
        同一个变量i。当creatFun()函数返回后,变量i的值是10,此时每个函数都引用
        着保存变量i的同一个变量对象,所以在每个函数内部i的值都是10。
   */
  //下面,我们通过创建另一个匿名函数强制让闭包的行为符合预期
  function creatFun2(){
      var arr = new Array();
      for(var i=0;i<10;i++){
           arr[i] = function(num){
               return function(){
                   return num;
               };
           }(i);
       }
       return arr;
  }
  var fun2 = creatFun2();
  console.log(fun2);//输出一个函数数组
  console.log(fun2[5]());//输出5
  for(var i=0;i<fun2.length;i++){
       console.log(fun2[i]());//输出0-9
   }
   

</script>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值