2017-08-25 124 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