2017-08-25 18 views
0

for-loop内で可変パラメータを使用して関数を作成しています。残念ながら、forループが2回目に実行されるとすぐに、変数を更新し、以前に生成された関数のすべてのパラメータを更新します。このループで「分離された」値を解析すると、次のループで上書きされません。変数が更新されたときに変数のパラメータが変更された関数

私の現在のコードはこれです:

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はグローバル – epascarello

答えて

1

varの代わりにletステートメントを使用すると、これを解決できます。単にvarletに置き換えてください。

これは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); 
} 

出力は、4を5倍されます。

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

もう1つの方法は、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

関連する問題