this.closure
またはしない限り、以下のコードが0から2までの数字を出力しない理由を誰かが説明できます
new crazyClosure(i)
かcrazyClosure.call({}, i)
?
var crazyClosure = function (count) {
var self = this;
function closure () {
console.log("closure", count);
};
this.closure = function () {
console.log("this.closure", count);
};
console.log("init", count);
setTimeout(function () {
console.log('');
console.log("call", count);
closure();
self.closure();
}, 0);
}
for (var i = 0; i < 3; i++) {
crazyClosure(i);
}
クロージャーが関数自体this
ではなくアタッチされる場合のようです。crazyClosure
私は見ることを期待します:
init 0
init 1
init 2
call 0
closure 0
this.closure 0
call 1
closure 1
this.closure 1
call 2
closure 2
this.closure 2
しかし、私は得る
init 0
init 1
init 2
call 0
closure 0
this.closure 2
call 1
closure 1
this.closure 2
call 2
closure 2
this.closure 2
回答に従って別の例を追加します。この例では、呼び出すたびにオーバーライドされる 2 つの関数がthis
あります。あなたの説明によると、私はまだそれがどのように起こるのか理解していません。window
crazyClosure
expected
unexpected
function crazyClosure (count) {
var self = this;
this.expected = function () {
console.log("this.expected", count);
self.unexpected();
};
this.unexpected = function () {
console.log("this.unexpected", count);
};
console.log("init", count);
setTimeout(self.expected, 10);
}
for (var i = 0; i < 3; i++) {
crazyClosure(i);
}
私は得る:
init 0
init 1
init 2
this.expected 0
this.unexpected 2
this.expected 1
this.unexpected 2
this.expected 2
this.unexpected 2
これは理解しなきゃ!!!ありがとう