js闭包的理解
闭包就是指有权访问另一个函数作用域中的变量的函数,就称作闭包
如何创建闭包,在一个函数中,新建另一个函数
为什么会形成闭包呢,这是因为函数作用域的原因导致的,一个函数在执行时,它会生成一个执行环境和它的活动对象(arguments和命名参数),一般情况,这个函数在执行完毕之后会被垃圾回收机制给销毁,但是如果在这个函数中,还有一个函数并且这个函数使用了外层函数中的变量,这时,他的执行环境会被销毁,但是,活动对象则不会销毁,直到这个函数执行完毕,外层活动对象才会被销毁
作用域链的这种配置机制引出了一个值得注意的副作用,即闭包只能取得包含函数中任何变量的最后一个值。别忘了闭包所保存的是整个变量对象,而不是某个特殊的变量。下面这个例子可以清晰地说明这个问题。
1 function createFunctions(){
2 var result = new Array();
3 for (var i=0; i < 10; i++){
4 result[i] = function(){
5 return i;
6 };
7 }
8 return result;
9 }
这个函数返回一个函数数组,看上去它应该返回的都是各自的索引值,但是它所有函数返回的都是10,这是因为当函数获取 i 时,外层函数早已执行完毕,执行作用域已经销毁,但是i因为被内部函数使用,没有销毁,i的值也变成循环完之后的值,就是10,上面说过,内部函数调用的是外层函数的活动对象也就是变量,参数等,这时,i已经变成10,所以这时所有函数返回值都是10
再看下面这个例子
1 function createFunctions(){
2 var result = new Array();
3 for (var i=0; i < 10; i++){
4 result[i] = function(num){
5 console.log(num)
6 return function(){
7 return num;
8 };
9 }(i);
10 }
11 return result;
12 }
13 createFunctions()
这个例子中对函数做出来一些改变,在内部函数外面,包了一层立即执行函数,并且把i当做参数传了进去,因为函数参数是按值传递的,所以就会将当前i的值复制给参数num,在立即执行函数执行完返回函数时,这个函数返回的num值就是当前变量i的值.
以上就是笔者对js闭包的理解,如有错误,请指正.

浙公网安备 33010602011771号