こんにちは、数値のセット配列を、元の数値を関数として返す配列に変更する必要がある問題に取り組んでいます。したがって、a[2] ではなく a2 が返されます。
答えはいらない、ヒントが欲しいだけ。配列をループして .pop() を使用して配列の最後の値を取得できることは知っていますが、そこから関数に変換する方法がわかりません。ヒントはありますか?
こんにちは、数値のセット配列を、元の数値を関数として返す配列に変更する必要がある問題に取り組んでいます。したがって、a[2] ではなく a2 が返されます。
答えはいらない、ヒントが欲しいだけ。配列をループして .pop() を使用して配列の最後の値を取得できることは知っていますが、そこから関数に変換する方法がわかりません。ヒントはありますか?
ここには3つの重要なステップがあります。
配列から数値を抽出します。のイテレータを持つループ内では、次のi
ようになります。
var num = numArray[i];
これは重要i
です。新しい関数を作成したときの値は保持されないためですfor
。ループが終了すると、最後の値になります。関数自体は次のようになります。
function() { return num; }
これ以上の参照はありませんi
。これは重要です。よりよく理解するには、クロージャについて読んでください。最後のステップは、必要な関数の配列に新しい関数を追加することです。
...これで完了です。
var numToFun = [1, 2, 3];
var numToFunLength = numToFun.length;
for (var i = 0; i < numToFunLength; i++) {
(function(num){
numToFun.unshift(function() {
return num;
});
}(numToFun.pop()))
}
基本的に、最後の数字から数字を取り出し、その数字が返された関数を構築し、配列の最初に戻します。1 つの完全なサイクルの後、それらはすべて関数です。
これがキャッチです:これがどのように機能するか、研究するのはあなた次第です
ループが単純な pop-unshift のように見えない理由:
for (var i = 0; i < numToFunLength; i++) {
numToFun.unshift(function() { //put into first a function
return numToFun.pop() //that returns a number
});
}
そして、なぜ私はこれをしたのですか: (ヒント: パフォーマンス)
var numToFunLength = numToFun.length;
編集:これを正しく行う方法の適切な説明については、他の人の回答を参照してください。ただし、私のものも修正します
他の人が指摘しているように、多くの人が苦労している JavaScript のトリッキーなことの 1 つは (明らかに私自身も含まれています)、JavaScript のスコープ変数が他の多くの言語と似ていないことです。スコープは、Java/C のように for ループなどの {} ブロックではなく、ほぼ純粋に関数によって定義されます。
したがって、以下で確認できます(およびここの他の回答でも)、スコープ関数はこのような問題を支援できます。
var numArray = [12, 33, 55];
var funcArray = [];
var numArrLength = numArray.length; // Don't do this in for loop to avoid the check multiple times
for(var j=0; j < numArrLength; j++) {
var scopeMe = function() {
var numToReturn = numArray[j];
console.log('now loading... ' + numToReturn);
var newFunc = function() {
return numToReturn;
};
return newFunc;
}();
funcArray.push(scopeMe);
};
console.log('now me');
console.log(funcArray);
console.log(funcArray[0]());
console.log(funcArray[1]());
console.log(funcArray[2]());
console.log(funcArray[1]()); // To ensure it's repeatable
以下の私の古い悪い答えを編集してください
あなたがやりたいことは次のようなものです
var funcArray = [];
for(...) {
var newFunc = function() {
return numArray.pop();
}
funcArray.push(newFunc);
}
ここで重要なのは、javascript の関数は変数に名前を付けて、そのように渡すことができるということです:)