2012-11-13 33 views
0

如果我創建一個變量,比如_this,並將其賦值給它,它將作爲閉包捕獲,而不是對當前版本的引用。爲什麼?爲什麼「this」在關閉中被捕獲?

示例代碼:

var AnimCore = (function() { 
    function AnimCore(ctx) { 
     this.ctx = ctx; 
    } 
    AnimCore.prototype.beginAnimation = function() { 
     this.animLoop(); 
    }; 
    AnimCore.prototype.animLoop = function() { 
     var _this = this; 
     this.ctx.drawSomething(); // removed actual drawing code, this is a proxy for it. 
     window.setTimeout(function() { 
      _this.animLoop(); 
     }, 1000/60); 
    }; 
    return AnimCore; 
})(); 

在這種情況下,被_this這個功能被稱爲每次結合到初始此,而不是新的。爲什麼?

[更新] 我現在明白,關閉發生在匿名函數中,這就是爲什麼_這總是指向相同的東西。然而,下一個問題是,這個.ctx爲什麼每次都工作?如果我不使用匿名函數,它會在第一次後失敗。

+3

我不明白這個問題。爲什麼?因爲這是如何JavaScript關閉工程... – gdoron

+0

提出不同的問題 - 你期望發生什麼?你能給個例子嗎? – Christoph

+0

@Christoph,看我的更新。代碼稍微更新。 –

回答

1

this是一個特殊的變量。這很特別,因爲它的上下文是在你調用內部的this函數時確定的。

但是,如果你要指定this一個變量,一個瓶蓋內:

var myFunc = (function() { 
    var staticThis = this; 
    return function() { 
     staticThis.doStuff(); 
    }; 
}).call(myObj); 

見我做什麼?
我有一個名爲staticThis的變量,我明確設置爲等於myObj
staticThis保持this(這恰好是一個指針,指向特定對象),而不是保持「魔力」動態上下文的this分辨率,這被保存以供this關鍵字。

相關問題