1

私はコードを持っています: デモ jsFiddle

これは 3 回ループし、そのたびにループ シーケンス番号を返す新しい関数を作成します。

配列0、1、および 2 に挿入されるループ シーケンスが表示されることを期待していました。

a[i] = function() {
            return i;
        }

すべてが正常に見えますが、取得した配列を印刷しようとすると

結果:

arr[0] is =>function () { return i; }
arr[1] is =>function () { return i; }
arr[2] is =>function () { return i; }

コード:

function f() {
    var a = [];
    var i;
    for (i = 0; i < 3; i++) {
        a[i] = function() {
            return i;
        }
    }
    return a;
}
var arr = f();

for (var index = 0; index < arr.length; index++) {
    document.write("<b>arr[" + index + "] is </b>=>" + arr[index] + "<br>");
}​

結果0、1、および 2が得られないのはなぜですか。

多くのthx。

4

3 に答える 3

3

は関数であるためa[i]、関数からの戻り値ではありません。つまり、基本的に配列に 3 つの関数本体を入力しているので、それらのいずれかを取得すると、関数の本体が返されます。返された関数を呼び出すことを試みることができますa[i].call()が、呼び出しごとに 3 を取得します。これは、Pointy がコメントで指摘した内容と一致しています。それがループが呼び出された最後の値だったので、ループが停止する直前に i が 3 になりました

フィドルを見る

于 2012-09-17T19:00:00.620 に答える
1

念のために言っておきますが、関数が作成されたときの値をそれぞれが返す3つの関数を持つ配列が本当に必要な場合は、関数を次のに割り当てるときにiコピーを渡す必要があります。ia[i]

function f() {
    var a = [];
    var i;
    for (i = 0; i < 3; i++) {
        a[i] = (function(n) {
            return function() {
                return n;
            };
        }(i));
    }
    return a;
}

var arr = f();

for (var index = 0; index < arr.length; index++) {
    document.write("<b>arr[" + index + "]() is </b>=> " + arr[index]() + "<br>");
}​

出力:

arr [0]()は=> 0
arr [1]()は=> 1
arr [2]()は=> 2

JSFiddle

于 2012-09-17T19:17:41.370 に答える
1

i関数が構築された時点ですべての配列要素が値を返すと予想した理由が理解できたと思います。これはそれほど大きな飛躍ではありませんが、これらの関数のすべてが 1 つのスコープを共有しています。値は作成された関数にリンクされていません。 「母」関数よりも有効なスコープです。このスコープには、 と呼ばれる単一の変数があり、iそれが になるまでインクリメントされます3本当にクロージャーを使いたいのであれば、あなたができる唯一のことはこれです:

function f()
{
    var a = [];
    var i;
    for (i = 0; i < 3; i++)
    {
        a[i] = (function(currentI)
        {//create a separate scope, pass current value of i to it
            return function()
            {
                return currentI;
            }
        })(i);
    }
    return a;
}
var arr = f();
for (var index = 0; index < arr.length; index++)
{
    document.write("<b>arr[" + index + "] is </b>=>" + arr[index]() + "<br>");
}​

ここでわかるように、これにより期待される結果が生成されます

于 2012-09-17T19:09:42.007 に答える