【发布时间】:2016-07-30 07:08:11
【问题描述】:
我在概念上对闭包有很好的处理,但是出现了一个我不太理解的问题。
当创建一个函数以将某个值传递给内部函数而不将其绑定到最外层函数返回时的最终值时,这似乎是不允许的:
function buildList(list) {
var result = [];
for (var i = 0; i < list.length; i++) {
function (x) { // this anonymous function definition...
var item = 'item' + list[x];
result.push(
return function () {
console.log(item + ' ' + list[x]);
};
);
}(i); // and simultaneous invocation...
}
return result;
}
而如果我将闭包完全移到对 .push() 的调用中,一切正常:
function buildList(list) {
var result = [];
for (var i = 0; i < list.length; i++) {
result.push(
function (x) { // wrapper now inside the call to .push()
var item = 'item' + list[x];
return function () {
console.log(item + ' ' + list[x]);
};
}(i) // and called here...
);
}
return result;
}
我想知道的是:当我定义将闭包立即包装在 for 循环内而不是在调用 .push() 内的匿名函数时,我违反了什么规则?
【问题讨论】:
-
result.push( return function...永远不会起作用,与关闭无关; return 是一个语句,语句是无效的。所以即使它没有抛出语法,你也不会 push() 什么。你也不能在 push() 中有一个结尾半,所以第一个代码有一些问题...... -
“这似乎不允许”是什么意思?
-
定义“效果很好”。您的预期行为是什么?每种情况有什么不同?
-
@VivinPaliath 是的。我正在建立一个功能列表。在第二个示例中实现了预期的行为。在第一个示例中,它中断了。我假设是因为我错误地定义了闭包。
-
@dandavis Dang。你说得对。但是,从广义上讲,我可以在 for 循环的每次迭代中创建一个匿名函数作为闭包的最外层包装器(并同时调用它),对吗?这没有明显的问题吗?
标签: javascript closures anonymous-function