最后一项任务来自这里:https ://learn.javascript.ru/closures-usage 。作者对解决方案的评论完全让我感到困惑。这里有人可以帮我整理一下我的想法吗?
function makeArmy() {
var shooters = [];
for (var i = 0; i < 10; i++) {
var shooter = function(x) {
return function() {
console.log( x );
};
}(i);
shooters.push(shooter);
}
return shooters;
}
var army = makeArmy();
army[0]();
army[5]();
这个特定的时刻并不清楚:
var shooter = function(x) {
return function() {
console.log( x );
};
}(i);
这个函数调用了什么函数,它(i)从哪里 x作为参数传递?
让您感到困惑的代码是IIFE。
英文 -立即执行的函数表达式
你也可以满足这个选项(没有区别):
它的工作原理是这样的:
shooter写入变量的不是函数本身,而是它的结果,因为我们在定义函数后立即调用它。您的示例可以这样重写但是,在 IIFE 示例中,我们没有用 any 污染范围
foo,我们只是获取函数,执行它并忘记。这对于创建闭包很有用,例如在这种情况下。x该参数仅取自后续调用(i)