有人可以(清楚而简明地)向我解释为什么这段代码的运作方式如何?我来自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接口时如何应用闭包技术的好实用例子?
感谢。
答案 0 :(得分:1)
在你的例子中,它非常简单。
在第一个示例中,只有一个变量i
,并且所有内容都引用该单个值。所以..它打印数字9
十次。每个函数都捕获了{em}的共享值i
。
在第二个示例中,您使用的是闭包。每个函数都有一个名为index
的私有变量,它接收 - 这里是重要部分 - 值i
的副本。
所以,你得到0
到9
,因为有十个函数,每个函数都有一个私有index
变量,每个index
变量都得到一个快照{ {1}} 当时存在。
这种更长的封闭形式可能会有所帮助:
i