【问题标题】:Why would a function be returned in this example instead of just a string为什么在这个例子中会返回一个函数而不是一个字符串
【发布时间】:2014-08-30 17:46:47
【问题描述】:

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 后面有什么好处吗?

【问题讨论】:

  • 这只是一个简单的例子。在更复杂的情况下,返回的函数可能需要额外的参数。对于这种情况,您可以只返回字符串,但这并不能说明闭包的工作原理,-)
  • @Sirko 第二个例子怎么没有说明一个闭包?似乎它与返回的函数保持i 的值相同
  • 第二个例子只是一个函数调用,并为(字符串)结果保留一个指针。也许阅读 How do JavaScript closures work? 以更清楚地了解闭包的实际含义。

标签: javascript function functional-programming closures


【解决方案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)传递给普通函数来避免闭包,否则只会执行关闭。

【讨论】:

  • 谢谢。你总是有最有启发性的例子。
【解决方案2】:

正如@sirko 在他的 cmets 中提到的那样,它不会起作用。

 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 想要指出的情况,如果我错了,请纠正我。

【讨论】:

    猜你喜欢
    • 2017-09-19
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    相关资源
    最近更新 更多