在an answer to this question中,我可以看到i
的值被保留为将其抛入另一个函数:
var funcs = [];
function createfunc(i) {
return function() { console.log("My value: " + i); };
}
for (var i = 0; i < 3; i++) {
funcs[i] = createfunc(i);
}
for (var j = 0; j < 3; j++) {
funcs[j](); // and now let's run each one to see
}
http://jsbin.com/raxifitaberu/1/edit
为什么函数createfunc()
需要返回另一个函数?为什么这比返回字符串更好:
var myArray = [];
function createFunc(i){
return "My value: " + i;
};
for (var i = 0; i < 5; i++){
myArray[i]=createFunc(i);
}
console.log(myArray[0]);
console.log(myArray[1]);
console.log(myArray[2]);
http://jsbin.com/demiloronohe/1/edit
将功能置于return
之后是否有一些优势?
答案 0 :(得分:1)
在你的例子中,它确实没有必要,因为函数返回一个常量表达式(忽略执行console.log
的副作用并将其作为“返回”值)
但是,我们可以给它一个参数并涉及一些逻辑:
var funcs = [];
function createfunc(i) {
return function(j) {
if (i == j) console.log("You've found " + i);
else console.log("I'm not " + j);
};
}
for (var i = 0; i < 3; i++)
funcs[i] = createfunc(i);
for (var j = 0; j < 3; j++)
funcs[j](2);
我希望现在变得更加清晰。当然,您总是可以通过在显式数据对象(示例中的字符串)中捕获它们的状态并将它们作为额外参数(您移动到循环中的console.log
)传递给普通函数来避免闭包。否则你就会执行关闭。
答案 1 :(得分:0)
正如@sirko在他的评论中提到的那样,它不会起作用。
var myArray = [];
function createFunc(i){
return function(b){
return i + b;
}
};
for (var i = 0; i < 5; i++){
myArray[i] = createFunc(i);
}
for (var j = 0; j < 5; j++){
console.log(myArray[j](j));
}
所以在这里你需要根据给内部函数的参数返回答案。就像@sirko想要指出的那样,如果我错了,请纠正我。