2014-10-09 123 views
0

以下代碼來自專業JavaScript for Web Developers,作者說我們應該得到一個長度爲10的數組,每個位置的值爲10。但是,我正在獲取一組函數 - 而不是值。這是爲什麼?如何對另一個函數的返回值執行一個函數?

function createFunctions(){ 
var result = new Array(); 

for (var i = 0; i < 10; i++){ 
result[i] = function(){ 
    return i; 
}; 

} 
return result; // 
} 

console.log(createFunctions()); 

這裏是我的控制檯讀取:

[function(){return i;}, function(){return i;}, function(){return i;}, function(){return i;}, function(){return i;}, function(){return i;}, function(){return i;}, function(){return i;}, function(){return i;}, function(){return i;}] 

編輯:我試着用下面的代碼修復它,但我仍然得到同樣的控制檯讀取:

function createFunctions(){ 
    var result = new Array(); 

    for (var i=0; i < 10; i++){ 
    result[i] = function(num){ 
     return function(){ 
     return num; 
     }; 
    }(i); // 
    } 
    return result; 

} 

console.log(createFunctions()); 
+0

看看這一行:'result [i] = function(){return i; };'。您正將一個*函數*分配給數組中的第i個位置。這就是爲什麼你得到一個*函數*的數組。你爲什麼對此感到驚訝? – 2014-10-09 16:39:45

+0

你有一個函數數組,如果你想讓它們執行,你需要執行它們。我想你的意思是你想要在將它們添加到數組中時執行它們,所以你需要添加'()',儘管它可能會或可能不會達到你所期望的。此外,'var result = [];'更具規範性。 – 2014-10-09 16:39:58

回答

2

我沒有這本書,但我相信我在書的代碼中找到了你正在嘗試的例子,該代碼可以從發佈者處下載。

作者試圖表明對變量i的引用被捕獲,因此按預期執行函數返回10而不是0到9(因爲i在循環結束時具有值10)。

這裏是代碼,用原來的document.write代替console.log。正如評論中所述,您需要執行這些功能才能看到作者描述的輸出。

function createFunctions(){ 
    var result = new Array(); 

    for (var i=0; i < 10; i++){ 
     result[i] = function(){ 
      return i; 
     }; 
    } 

    return result; 
} 

var funcs = createFunctions(); 

//every function outputs 10 
for (var i=0; i < funcs.length; i++){ 
    //document.write(funcs[i]() + "<br />"); 
    console.log(funcs[i]()); 
} 
+0

好。我明白我需要調用這個函數,並且我很欣賞你在這裏寫的東西。但是當我調用createFunctions()時,我不執行結果函數嗎?另外,當我在編輯中將匿名函數放在括號中時,是不是立即調用函數? – Goodword 2014-10-09 20:12:43

+0

不,編輯時,for循環中調用的函數會再次創建一個函數並將其返回以存儲在數組中,因此'createFunctions()'返回一組函數。這裏的不同之處在於你正在調用立即調用的函數並將當前值'i'傳遞給它,這就是你的數組中的函數將返回的值(在該次迭代中'i'的值)。 – 2014-10-09 20:59:34

1

這取決於當你想要的結果上有這樣兩個方面,這

1)

function createFunctions(){ 
    var result = new Array(); 

    for (var i = 0; i < 10; i++){ 
    result[i] = function(){ 
     return i; 
    }; 

    } 
    return result; // 
} 

你會那麼需要通過調用來獲取函數的返回值功能

var vals = createFunctions(); 
for(var i = 0; i > vals.length; i++) 
{ 
    console.log(vals[i]()); 
} 

2)在創建時調用函數

function createFunctions(){ 
    var result = new Array(); 

    for (var i = 0; i < 10; i++){ 
    result[i] = function(){ 
     return i; 
    }(); 

    } 
    return result; // 
} 

console.log(createFunctions()); 

如果您注意到在通過循環時函數的末尾添加了括號,則執行該函數並返回該值。如果沒有括號,只需將函數分配給數組而不是數值

相關問題