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

ネストされた関数はクロージャーであるため、num引数への参照がnumあり、ループの最後の引数は 4 です。最初の要素がクリックされたときに、なぜ 1 を警告するのですか?それは 4 を警告する必要があります。警告する理由は何ですか? 1 ?num引数を参照していませんか?それとも理由は何ですか?

しかし、ここではケースが異なります:

function foo(x) {
    var tmp = 3;
    return function (y) {
       alert(x + y + (++tmp));
    }
}
var bar = foo(2); // bar is now a closure.
bar(10);

上記の関数は 16 をアラートします。これは、bar が直接スコープ内になくても、引き続き argxおよびを参照できるためです。tmp

これは、上記のコードが毎回 4 を警告しない理由よりも、クロージャが引数値への参照も持っていることを証明していますか?

4

2 に答える 2