2016-09-20 29 views
-2

試圖通過i進入封閉來使它局部避免i關閉問題基本維持在2爲什麼我不能傳遞的參數在起作用for循環

var myFunctions = {}; 

for (var i = 0; i < 3; i++) {  // let's create 3 functions 

    myFunctions[i] = function(i) { // and store them in myFunctions 
     console.log("My value: " + i); // each should log its value. 
    }; 

} 

for (var j = 0; j < 3; j++) { 
    myFunctions[j]();    // and now let's run each one to see 
} 

// > "My value: undefined 
// > "My value: undefined 
// > "My value: undefined 
+3

那麼當你調用函數,你** **不傳遞參數。 – Pointy

+0

我是一個白癡:) – js2015

+1

調用它像'myFunctions [j](j);' – Redu

回答

1

這是發生的原因是因爲你有i中的功能參數,但你不及格的值。

有三種方法可以解決這個問題。


首先,你可以通過值作爲函數參數:

myFunctions[j](j); 

第二種方法是使用函數閉包存儲值:

var myFunctions = {} 

function generateValuePrintout (value) { 
    return function() { 
     console.log("My value: " + value); 
    }; 
} 

for (var i = 0; i < 3; i++) { 
    myFunctions[i] = generateValuePrintout(i); 
} 

for (var j = 0; j < 3; j++) { 
    myFunctions[j](); 
} 

這是比第一種方法更簡單的方法,因爲這意味着您不需要將任何值傳遞給函數以便知道它的c losure。


最後一個辦法(我的最愛)。將存儲使用let(因此它被正確作用域)函數的值,然後調用它沒有一個參數(由函數定義也刪除參數):

for (var i = 0; i < 3; i++) {  // let's create 3 functions 

    let closureValue = i; 

    myFunctions[i] = function() { // and store them in myFunctions 
     console.log("My value: " + closureValue); // each should log its value. 
    }; 

} 
for (var j = 0; j < 3; j++) { 
    myFunctions[j]();    // and now let's run each one to see 
} 

每個的輸出將是:

我的值:0

我的價值:1個

我值:2

1

要調用該函數不需要傳遞它所需要的參數。

var myFunctions = {}; 

for (var i = 0; i < 3; i++) { 
    myFunctions[i] = function (i) { 
     console.log("My value: " + i); 
    }; 
} 

for (var j = 0; j < 3; j++) { 
    myFunctions[j](j); // Passing the required parameter 
} 

// > "My value: 0 
// > "My value: 1 
// > "My value: 2 
+0

對不起。我認爲這很清楚。我附上了固定代碼。 – felipeptcho

2

這是因爲在函數定義的i的期望是什麼作爲參數傳遞給函數

試試這個

var myFunctions = {}; 

for (var i = 0; i < 3; i++) {  // let's create 3 functions 

    myFunctions[i] = function(i) { // and store them in myFunctions 
     console.log("My value: " + i); // each should log its value. 
    }; 

} 
for (var j = 0; j < 3; j++) { 
    myFunctions[j](j);    // pass j as parameter 
} 
0

雖然參數不是necessarry在JavaScript

但如果你想要使用的值應該在那裏參數

for (var j = 0; j < 3; j++) { 
myFunctions[j]("name"+j);    // and now let's run each one to see 
} 

輸出

My value: name0 

My value: name1 

My value: name2 
相關問題