为什么在此示例中返回函数而不仅仅是字符串

时间:2014-08-30 17:46:47

标签: javascript function functional-programming closures

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之后是否有一些优势?

2 个答案:

答案 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想要指出的那样,如果我错了,请纠正我。