码迷,mamicode.com
首页 > 编程语言 > 详细

Javascript 闭包

时间:2014-12-15 23:28:59      阅读:292      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   使用   sp   for   

闭包的概念:在一个函数(B)中访问另一个函数(A)的局部变量,函数(B)和函数(A)的局部变量一起 就构成了一个闭包。

一个 简单的闭包的例子:

      function countFun() {
          var count = 0;
          this.increaseNum = function () {
             return ++count;
          }
      }
      var stu = new countFun();
      alert(stu.increaseNum()); // "1"
      alert(stu.increaseNum()); // "2"

在countFun函数中,count是一个局部变量,正常情况下在函数外部是访问不到count的值。但是这里我们使用了一个闭包,在匿名函数中引用了count,构成了一个闭包,所以count的值可以累加。

在第一次调用 stu.increaseNum()之前,count的值如左下图所以。在以第二次调用stu.increaseNum()之后, count 的值如右下图所示:

bubuko.com,布布扣bubuko.com,布布扣

 

闭包可能会产生的问题,或闭包的副作用:

下面函数的预期结果是输出:“0” “1” “2”

        function createFun() {
            var result = new Array();
            for (var i = 0; i < 3; i++) {
                result[i] = function () { return i; };
            }
            return result;
        }
        var arr = createFun();
        for (var j = 0; j < arr.length; i++) {
            alert(arr[j]());   //result: "3","3","3"
        }

在上面的例子中,在createFun函数的内部有一个匿名函数引用了i,所以会产生闭包,result 数组中保存的是匿名函数,在匿名函数中会引用 变量i(保存的是整个变量对象,不是i中的值)。所以最终得不到想要的结果。

消除闭包的副作用:

        function createFun() {
            var result = new Array();
            for (var i = 0; i < 3; i++) {
                result[i] = (function (num) {
                    return function () { return num; };
                })(i);
            }
            return result;
        }
        var arr = createFun();
        for (var j = 0; j < arr.length; i++) {
            alert(arr[j]());
        }

还有一个解决方法就是只保存值在result数组中。如下所以:

      function createFun() {
          var result = new Array();
          for (var i = 0; i < 3; i++) {
              result[i] = (function () { return i; })();
          }
          return result;
      }
      var arr = createFun();
      for (var j = 0; j < arr.length; j++) {
          alert(arr[j]);
      }

 

Javascript 闭包

标签:style   blog   http   io   ar   color   使用   sp   for   

原文地址:http://www.cnblogs.com/qiwubg/p/4165154.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!