封闭变量意味着什么?

时间:2014-05-29 18:23:57

标签: javascript

以下示例取自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。

关闭

但是我无法理解粗体部分 - 你能解释一下吗?

1 个答案:

答案 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 - 该功能根本看不到相同的变量。