2

このページでは、悪名高いループ問題について説明します。

function addLinks () {
    for (var i=0, link; i<5; i++) {
        link = document.createElement("a");
        link.innerHTML = "Link " + i;
        link.onclick = function () {
            alert(i);
        };
        document.body.appendChild(link);
    }
}
window.onload = addLinks;

そして1つの解決策:

function addLinks () {
    for (var i=0, link; i<5; i++) {
        link = document.createElement("a");
        link.innerHTML = "Link " + i;
        link.onclick = function (num) {
            return function () {
                alert(num);
            };
        }(i);
        document.body.appendChild(link);
    }
}
window.onload = addLinks;

これが私の質問です: 呼び出している関数が親関数の外側 (たとえば、addLinks の外側) にある場合、悪名高いループの問題は依然として問題になりますか?

function addLinks () {
    for (var i=0, link; i<5; i++) {
        link = document.createElement("a");
        link.innerHTML = "Link " + i;
        link.onclick = Outside(i);
        document.body.appendChild(link);
    }
}
function Outside(i) {
    alert(i);
};
window.onload = addLinks;

onclick が関数として呼び出されているときに addLinks がまだ作成されていないため、問題が発生するためだと思います。関数を addLInks の外側に配置すると、悪名高いループの問題が軽減されるはずですよね?

4

3 に答える 3

4

コードの問題は、それが機能しないことです。

link.onclick = Outside(i);

Outside(i)未定義を返すため、関数をバインドしません。

同様の実用的な解決策は、次のように定義するOutsideことです

function Outside(i) {
    return function() {
       alert(i);
    }
};

2番目のコードが機能するのと同じ理由で機能します。関数を呼び出すとOutside、変数の新しいスコープが作成されますi(クロージャーと呼ばれます)。

ループから構築するソリューションには、おそらく関数呼び出し以上のものが含まれます。varキーワードまたはその関数の引数として、変数の宣言が必要になります。

于 2013-03-27T20:44:40.630 に答える
2
link.onclick = Outside(i);

Outside(i)それは、リスナーをそのデフォルト値でその関数に等しく設定するのではなく、実際に呼び出します。Ext のようなさまざまなツールキットは、dystroy が示したものと同様のデリゲートを作成する方法を提供します。たとえば、Ext 3.X では次のようにできます。

link.onclick = Outside.createDelegate(link, [i]) へlinkthisコンテキストおよびiデフォルト パラメータとして持つデリゲートを作成しますOutside

サンプルを機能させるには、次のようにする必要があります。

function Outside(i) {
    return function() { alert(i); }
};
于 2013-03-27T20:46:22.637 に答える
2

あなたが書いたコードは実行されないと思います。

外部は何も返しません。したがって、Outside(i) を呼び出すと undefined が返されます。これは、link.onclick=undefined を設定していることを意味します。

于 2013-03-27T20:46:51.413 に答える