变量更新时变量参数发生变化的函数
问题描述:
我使用变量参数在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();但是这似乎也不起作用。
答
要完成的答案:这里的封闭溶液中。闭包具有工厂方法和闭包方法。工厂方法每次创建一个新的作用域,关闭可以稍后使用。
您可以通过使用闭包或使用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);
}
'variableArray' is global – epascarello