javascript闭包和范围链示例

时间:2014-04-12 04:03:05

标签: javascript binding closures scope-chain

有人可以(清楚而简明地)向我解释为什么这段代码的运作方式如何?我来自Java(6和7)中的强类型背景,其中闭包不存在并且不像它们在javascript中那样起作用。我认为与这个问题相关的概念是:闭包和范围链。

以下是示例:

var myfuncs = function() {
    var funcs = []
    var i;
    for (i = 0; i < 10; i++) {
       funcs[i] = function() { console.log(i); }
    }
    return funcs;
}

var allfuncs = myfuncs();
allfuncs.forEach(function(fn) { fn(); });

上面的例子记录了9次(10次),但期望和我自己的直觉认为它会记录0-9。

为什么它的工作方式与Javascript相同?闭包是非常强大的,但我试图一劳永逸地掌握这个概念!稍微修改的示例会生成正确的输出,但为什么?

var myfuncs = function() {
    var funcs = []
    var i;
    for (i = 0; i < 10; i++) {
       funcs[i] = (function(index) { console.log(index); })(i);
    }
    return funcs;
}

var allfuncs = myfuncs();
allfuncs.forEach(function(fn) { fn(); }); 

闭包不是Javascript独有的,但是我想知道为什么它们在javascript被写入与浏览器/ dom接口的时候是强大的。

有没有人在与浏览器/ dom接口时如何应用闭包技术的好实用例子?

感谢。

1 个答案:

答案 0 :(得分:1)

在你的例子中,它非常简单。

在第一个示例中,只有一个变量i,并且所有内容都引用该单个值。所以..它打印数字9十次。每个函数都捕获了{em}的共享值i

在第二个示例中,您使用的是闭包。每个函数都有一个名为index的私有变量,它接收 - 这里是重要部分 - 值i副本

所以,你得到09,因为有十个函数,每个函数都有一个私有index变量,每个index变量都得到一个快照{ {1}} 当时存在。

这种更长的封闭形式可能会有所帮助:

i