2014-08-30 29 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想要指出的是,如果我錯了,請糾正我。

相關問題