闭包、作用域链

34次阅读

共计 539 个字符,预计需要花费 2 分钟才能阅读完成。

1. 说到闭包大家可能会说函数套函数,延长作用域链。对没错,确实是这样的,但是你对他的理解是多少呢,函数闭包可以说的有很多,夸张的说,说个半天是绝对没问题的,它的用处非常多,作用也非常多,这个需要你多想想的,不多说,下面我们来看代码。
function A(){
var x = 1;
return function(){
x++;
console.log(x);
}
}
var m1 = A();
m1();//2
m1();//3
var m2 = A();
m2();//2
m1();//4
刚开始一直不明白为什么 m1 执行两次 x 的值会累加。我这属于没有明白函数的执行环境及作用域链。当 m1 第一次执行时 A()会在内存中开辟一个环境,然后返回函数也会开辟一个执行环境也就是大圈里面有个小圈,此时小圈里的 x 时从大圈里拿的,然后会打印 2,第二次执行 m1 时,由于第一次执行 m1 延长作用域链,也就是大小圈依然存在而且里面的 x =2,此时大圈将 x 的值重新赋值为 1,但是小圈里的 x 依旧是 2,当执行到 x ++ 是,会检测当前环境是否有 x,答案是有此时 x =2,执行 x ++ 时就是 2 ++,打印出来就是 3,当将 A() 给了 m2 时又会开辟一个环境,这两个环境并不干扰,没有任何联系。以上就是我对闭包的一点拙见,可能有不对的地方(全凭个人乱想),请大佬指正!

正文完
 0