Javascript 变量更新时具有变量参数的函数发生更改

Javascript 变量更新时具有变量参数的函数发生更改,javascript,function,parameters,Javascript,Function,Parameters,我正在使用可变参数在for循环中创建函数。不幸的是,一旦for循环再次运行,它就会更新变量并更新以前生成的函数的所有参数。如何在这个循环中解析分离的值,使其不会被下一个循环覆盖 我目前的代码是: var self = this; for (var i = 0; i < wordObjects.length; i++) { var wordCurrent = wordObjects[i].word; var wordCorrect = wor

我正在使用可变参数在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;
      };

我试着通过一个数组;但是这似乎也不起作用。

您可以通过使用闭包或使用let语句代替var来解决这个问题。只需用let替换var即可

这是因为let的作用域不同。请查看文档:

举个例子:

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

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);
}

非常感谢你!测试一下。如果您喜欢,请选择它作为答案:如果您有任何进一步的问题,请随意提问。一切都很好,但我现在有一个问题,就是UglifyJS抛出了一个错误,因为let is ES6,而UglifyJS还不支持这一点。有没有其他方法可以让它在旧浏览器上运行呢?@vinni肯定。使用一种闭合解决方案。这将在ES6.0全球范围内运行
for(var i=0;i<5;i++) {
    setTimeout(function() { console.log(this); }.bind(i), i*1000);
}