在 JavaScript 中,您有函数语句和函数表达式。第一个声明命名函数,后者评估为命名或匿名函数。您正在使用函数表达式。
我认为您想要做的是调用表达式。您所要做的就是立即调用返回的函数i
。
function f() {
var i, array = [];
for (i = 0; i < 3; i++) {
// The extra parentheses around the function are unnecessary here.
// But this is more idiomatic, as it shares syntax with how function
// expressions are introduced in statements.
// I.e. you could just copy-paste it anywhere.
array[i] = (function () {
return i;
})(); // don't rely on automatic semicolon insertion
}
return array;
}
另请注意,在您有问题的示例中,所有闭包都返回3
,因为它们都捕获相同的 variable i
。
编辑:为了使上一段更清楚,如果你真的想要有 3 个不同的闭包,你必须为每个闭包创建一个新的范围。与其他语言不同,Javascript 不会仅仅通过打开一个块来创建范围。它只在函数中创建范围。这里有两种方法:
function f() {
var i, array = [];
for (i = 0; i < 3; i++) {
// With a parameter in an inner function
array[i] = (function (n) {
return function () {
// A new n is captured every time
return n;
};
})(i);
}
return array;
}
function f() {
var i, array = [];
for (i = 0; i < 3; i++) {
array[i] = (function () {
// With a variable in an inner function
var n = i;
return function () {
// A new n is captured every time
return n;
};
})();
}
return array;
}
然而,下一个例子是错误的,因为即使n
在for
块中声明,它也好像它已在函数顶部声明并且仅在for
块中初始化。请记住,这是 JavaScript,不是 Java,不是 C,不是 C#,不是 <whatever 括号内的语言>:
function f() {
var i, array = [];
for (i = 0; i < 3; i++) {
var n = i;
array[i] = function () {
return n;
};
}
return array;
}
等效代码:
function f() {
var i, array = [];
var n;
for (i = 0; i < 3; i++) {
n = i;
array[i] = function () {
return n;
};
}
return array;
}