闭包与变量

闭包所保存的变量是整个变量对象,而不是某个特殊的变量,即闭包只能取得包含函数中任何变量的最后一个值。

   function createFunctions(){

       var result =new Array();

       for(i=0;i<=10;i++){

           result[i]=function(){

               return i;

                   };

       }

       return result;

   }

   这个函数会返回一个函数组。表面上看,似乎每个函数都应该返自己的索引值,即位置为0的函数返回值0,位置1的函数值返回1。但实际上,每个函数都返回10,因为每个函数的作用域链中都保存着createFuctions()函数的活动对象,所以他们引用的都是同一个变量i。当i createFuctions()函数返回后,变量i 的值是10。此时每个函数都引用着保存变量i的同一个变量对象,所以在每一个函数内部i的值都是10。再看下例

   function createFunctions(){

   var result =new Array();

   for(i=0;i<=10;i++){

   result[i]=function(num){

       return function(){

           return num;

           }

       }(i);

   }

   return result;

   }

   在重写前面的函数的createFunctions()函数后,每个函数就会返回各自不同的索引值了,在这个版本中,我们没有直接把闭包赋值给数组,而是定义了一个匿名函数,并将立即执行该匿名函数的结果赋值给数组。这里的匿名函数有一个参数num,也就是最终函数要返回的值。在调用每个匿名函数时,我们传入了一个变量i。由于函数参数是按值传递的,所以就会将变量i的当前值复制给参数num。而在这个匿名函数内部,又创建并返回了一个访问num的闭包。这样一来,result数组中的每个函数都有一个自己的num变量副本,因此就可以返回各自不同的值了。

   使用闭包可以在js中模仿块级作用域,创建并立即调用一个函数,这样既可以执行其中的代码,又不会再内存留下该函数的引用。闭包还可以用于在对象中创建私有变量,js中没有私有对象属性的概念,但可以使用闭包来实现公有方法,而通过公有方法可以访问包含在作用域中定义的变量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章