2017-08-25 139 views
0

我使用變量參數在for循環內創建函數。不幸的是,只要for循環第二次運行,它就會更新變量並更新以前生成的函數的所有參數。我怎樣才能在這個循環中解析一個「分離的」值,所以它不會被下一個循環覆蓋?變量更新時變量參數發生變化的函數

我當前的代碼是這樣的:

var self = this; 

     for (var i = 0; i < wordObjects.length; i++) { 
     var wordCurrent = wordObjects[i].word; 
     var wordCorrect = wordObjects[i].correct; 
     var moreData = wordObjects[i].moredata; 
     var successFunction = wordObjects[i].successFunction; 

     //chain all arguments in one array 
     variableArray = [] 
     variableArray = variableArray.concat(wordCorrect); 
     variableArray = variableArray.concat(moreData); 

     //create function 
     var runFunction = function() {self.executeFunctionByName(successFunction, self, variableArray)}; 
     this.saveFunctions[wordCurrent] = runFunction; 
     }; 

我試圖生成內部的所有數組對象,但隨後並沒有在所有通過陣列。它看起來像這樣:

var runFunction = function() {self.executeFunctionByName(successFunction, self, variableArray[i])}; 

我試着通過variableArray.slice();但是這似乎也不起作用。

+0

'variableArray' is global – epascarello

回答

1

您可以通過使用閉包或使用let而不是var來解決此問題。只需將var替換爲let即可。

這是因爲let的不同範圍。看看文檔:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

拿這個例子:

for(var i=0;i<5;i++) { 
    var j=i; 
    setTimeout(function() { console.log(j); }, i*1000); 
} 

輸出爲5X四強。

for(var i=0;i<5;i++) { 
    let j=i; 
    setTimeout(function() { console.log(j); }, i*1000); 
} 

的輸出是0,1,2,3,4,


要完成的答案:這裏的封閉溶液中。閉包具有工廠方法和閉包方法。工廠方法每次創建一個新的作用域,關閉可以稍後使用。

for(var i=0;i<5;i++) { 
    setTimeout((function() { var j=i; return function() { console.log(j); }; })(), i*1000); 
} 

另一種方法是將i存儲爲函數的上下文。這也將工作:

for(var i=0;i<5;i++) { 
    setTimeout(function() { console.log(this); }.bind(i), i*1000); 
} 
+0

非常感謝! – vinni

+0

測試它。如果你喜歡它,請選擇它作爲答案:)如果你有任何進一步的問題隨時問 –

+0

一切工作正常,但我現在有問題,UglifyJS拋出一個錯誤,因爲讓是ES6和UglifyJS不支持然而。有沒有其他方法可以讓它在舊版瀏覽器上也能使用? – vinni