2

こんにちは、数値のセット配列を、元の数値を関数として返す配列に変更する必要がある問題に取り組んでいます。したがって、a[2] ではなく a2 が返されます。

答えはいらない、ヒントが欲しいだけ。配列をループして .pop() を使用して配列の最後の値を取得できることは知っていますが、そこから関数に変換する方法がわかりません。ヒントはありますか?

4

3 に答える 3

1

ここには3つの重要なステップがあります。

  • 配列から数値を抽出します。のイテレータを持つループ内では、次のiようになります。

    var num = numArray[i];

  • これは重要iです。新しい関数を作成したときの値は保持されないためですfor。ループが終了すると、最後の値になります。関数自体は次のようになります。

    function() { return num; }

  • これ以上の参照はありませんi。これは重要です。よりよく理解するには、クロージャについて読んでください。最後のステップは、必要な関数の配列に新しい関数を追加することです。

...これで完了です。

于 2012-04-05T04:00:03.680 に答える
1
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;
于 2012-04-05T03:55:51.787 に答える
0

編集:これを正しく行う方法の適切な説明については、他の人の回答を参照してください。ただし、私のものも修正します

他の人が指摘しているように、多くの人が苦労している 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 の関数は変数に名前を付けて、そのように渡すことができるということです:)

于 2012-04-05T03:47:15.113 に答える