2014-08-30 57 views
2

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

这只是一个简单的例子。在更复杂的情况下,返回的函数可能需要额外的参数。对于这种情况,你可以只返回字符串,但这并不能说明闭包是如何工作的, - ) – Sirko 2014-08-30 17:51:34

+0

@Sirko第二个例子没有说明闭包?它看起来像是保存了'i'的值,与返回的函数相同 – 1252748 2014-08-30 17:58:54

+0

第二个示例仅仅是一个函数调用并保留了(字符串)结果的指针。也许阅读[如何JavaScript闭包工作?](http://stackoverflow.com/q/111102/1169798)一些更清晰的实际封闭。 – Sirko 2014-08-30 18:14:35

回答

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)已经执行了关闭。

+0

谢谢。你总是有最启发性的例子。 – 1252748 2014-08-30 18:42:20

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

相关问题