以下示例取自a StackOverflow answer,有助于识别闭包。
for (var i = 0; i < 10; i++) {
(function f() {
var i2 = i;
setTimeout(function g() {
console.log(i2);
}, 1000);
})();
}
给出了以下解释:
对于g:
列出变量: console是一个自由变量。 i2是一个自由变量。 找到每个自由变量绑定到的父作用域: 控制台绑定到全局范围。 i2受f的范围约束。 引用的函数在哪个范围内? setTimeout的范围。 因此控制台没有被g关闭。 因此,i2被g。
关闭
但是我无法理解粗体部分 - 你能解释一下吗?
答案 0 :(得分:1)
该帖子中的术语“封闭”变量意味着该函数的调用者无法访问变量;从调用函数的上下文中既不可见也不可修改。我们稍微修改一下代码:
var mySetTimeout = function (func, timeout) {
console.log = function (arg) { alert(arg); };
i = "foobar";
i2 = "barfoo";
setTimeout(func, timeout);
};
var i = "peekaboo";
(function f() {
var i2 = i;
mySetTimeout(function g() {
console.log(i2);
}, 1000);
})();
而不是setTimeout
,函数f
调用{em>尝试的mySetTimeout
来更改超时后记录的值过去了,记录功能。
调用函数f
并返回后,仅函数g
可以查看并修改变量i2
。但是console
未关闭,因为它是全局范围内的值;如果您执行console.log = function (i) { alert(i); };
,则会在超时触发时收到警告框。但是,您无法在i2
中阅读或修改myTimeout
- 该功能根本看不到相同的变量。