对js闭包的理解

闭包的基本理解

闭包是什么?相信很多初学JS的人一定对这个概念比较模糊,我也是看了很多博客和书籍才稍微了解了一点。因为闭包的应用非常广泛,在js代码里基本可以说是随处可见,所以想要学好js,闭包是必须要掌握的。不过在了解闭包之前,首先要了解JS的全局变量,局部变量和作用域链,关于作用域链可以参考这篇博客 http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html


在了解作用域链之后,就开始学习闭包吧

我们在定义局部变量的时候一定要记得var命令,如果没有这个,声明出来的变量就是全局变量。

  function f1(){
      n=1;
  }
  alert(n); // 1

上面代码等同于

  var n=1;
  function f1(){
  }
  alert(n); // 1

因为js的函数内部可以直接访问到外部的变量

  var n=1;
  function f1(){
      alert(n); // 1
  }

外部就不能访问内部的变量

  function f1(){
      var n=1;
  }
  alert(n); // error

闭包就是能使外部访问其他函数内部的函数,举一个闭包的简单例子吧

  function a(){
        var i=0;
        function b(){
            alert(++i);
        }
        return b;
    }
    var c = a();
    c(); // 1

这段代码有两个特点:
1、函数b嵌套在函数a内部;
2、函数a返回函数b;
这样在执行完var c=a()后,变量c实际上是指向了函数b,再执行c()后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,就是说:
当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
简而言之,闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。
在上面的例子中,由于闭包的存在使得函数a返回后,a中的i始终存在,这样每次执行c(),i都是自加1后alert出i的值。
用闭包可以解决很多问题,如

  function a(){
      var result = new Array();
        for(var i=0;i<10;i++)
        {
            result[i]=function(){
                return i;
            }
        }
        return result;
    }

这个函数会返回一个函数数组,表面上看每个函数都应该返回自己索引值,也就是位置0的时候返回0,1的时候返回1。但实际上每个函数都返回的是10,因为每个函数的作用域链里都保存这a()函数的活动对象,所以他们引用的都是同一个变量i,当函数a()返回后,i的值为10,此时每个函数都保存这同一个变量i,所以每个函数内部i的值都是10,用闭包的解决方法如下:

  function a(){
      var result = new Array();
        for(var i=0;i<10;i++)
        {
            result[i]=(function(i){
                return function(){
                    return i;
                };
            })(i);
        }
        return result;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值