作者:依一勇婷16_639 | 来源:互联网 | 2023-06-05 08:05
闭包解释有很多。github上有木易博客讲的非常不错。可以说是标准答案了先说自由变量全局变量xvarx10;全局functionfunctionfoo(){console.
闭包解释有很多。github上有木易博客讲的非常不错。可以说是标准答案了 先说自由变量
// 全局变量 "x"
var x = 10;// 全局function
function foo() {console.log(x);
}(function (funArg) {// 局部变量 "x"var x = 20;// 这不会有歧义// 因为我们使用"foo"函数的[[Scope]]里保存的全局变量"x",// 并不是caller作用域的"x"funArg(); // 10, 而不是20})(foo); // 将foo作为一个"funarg"传递下去
所谓“自由变量”的概念,就是一个函数非本地定义也不是函数参数的变量
从自由变量延伸到闭包:
1,从实践角度:以下函数才算是闭包:
- 即使创建它的上下文已经销毁,它仍然存在(比如,内部函数从父函数中返回)
- 在代码中引用了自由变量
2,还有理论角度的闭包(红宝书(p178)上对于闭包定义)。就是
闭包是指有权访问另外一个函数作用域中的变量的函数
关键在于下面两点:
从理论角度:所有的函数。因为它们都在创建的时候就将上层上下文的数据保存起来了。哪怕是简单的全局变量也是如此,因为函数中访问全局变量就相当于是在访问自由变量,这个时候使用最外层的作用域