我正在阅读“Javascript:The Good Parts”一书中关闭的内容。
以下是使用闭包的示例:
var add_the_handlers = function (nodes) {
var i;
for (i = 0; i < nodes.length; i += 1) {
nodes[i].onclick = function (i) {
return function (e) {
alert(i + ":" + e);
};
}(i);
}
};
这是正确的例子吗?还是会有更多正确的例子?
var add_the_handlers = function (nodes) {
var i;
for (i = 0; i < nodes.length; i += 1) {
nodes[i].onclick = function (idx) {
return function (e) {
alert(idx + ":" + e);
};
}(i);
}
};
外部函数中的变量i和内部函数中的变量i“nodes [i] .onclick = function(i)” - 它是两个不同的变量。 第三个函数从第二个函数访问变量,而不是从最外面的函数访问变量 我是对的吗?
答案 0 :(得分:2)
是的,示例正确。您看作函数参数的i
变量优先于外部i
变量,因为它在本地范围内声明。
答案 1 :(得分:2)
这两个例子完全相同。闭包的关键是将外部范围的变量(i)转换为内部范围的变量(i / idx / foo,选择你的选择)。闭包创建变量的“副本”,以便在进行回调时,它具有正确的值。
// outer-scoped i changes on each iteration
var i;
for (i = 0; i < nodes.length; i += 1) {
nodes[i].onclick = function (i) {
// here i now refers to a different variable; while the outer i keeps iterating,
//this i is preserved at its current value.
return function (e) {
alert(i + ":" + e);
};
}(i);
}
答案 2 :(得分:0)
从javascript的角度来看 - 这两者是相同的。因此,这是味道的问题。如果你内部有更多的闭包,那么使用不同的名称是个好主意。但这里的例子很简单 - 没有必要这样做。
答案 3 :(得分:0)
不,您发布的两个示例完全相同。唯一的区别只是函数的参数名称,但这无关紧要,你可以使用任何东西。