你要知道Javascript怎麼執行的。
var user = {
count: 1,
getCount: function(){
return this.count;
}.bind(this)
};
這個例子中,getCount:
之後的expression是在var user
同樣的context中跑,跑完才把結果assign給getCount。在這個context中執行bind(this)
,就看執行當下的this是什麼。如果是在global context跑,那就是window物件。
這樣會跑出1:
function A() {
this.count = 1;
var inner = {
getCount: function() {
console.log(this.count);
}.bind(this)
};
//會bind到constructor執行當下的this,也就是A產生的實例
this.togo = function() {
inner.getCount();
}
}
var a = new A;
a.togo();
這個我明白,因為 new 會讓 this 指向新建構的物件,所以 bind 中的 this 會指向 a ,而 a 的 count 就是 1 。可是為何
var user = {
count: 1,
getCount: function(){
return this.count;
}.bind(this)
};
中的return this.count
的 this 會指向 user ,而 bind 中的 this 卻是指向 window ?
我不是說過
function(){
return this.count;
}.bind(this)
這個expression跑的時候,this是指向window嗎?假設var user
是在global context跑的話。
Javascript的this,基本上是runtime決定的。所以function裡面的this,會到執行的時候決定。但是問題是跑bind的時候,他是在global context下,這時的this是window。然後你的function就被綁住,this永遠是window。即使你跑user.getCount()
也一樣。
所以物件中不是新的 context ,只有在 function 才是新的 context ,因此 bind 中的 this 取決於你在哪裡執行,是這個意思嗎?
不是。
先不管function expression裡面的this,因為他是function執行實才會決定。你的function expression是:function(){...}.bind(this)
,以你的例子,上述expression是在global context執行的,所以bind傳進來的this是window物件。然後你定義的function,this就被綁在window物件不會改變,然後這個bound function就指派給user物件的getCount屬性。
執行user.getCount()
時,因為他已經被綁在window物件,如果window物件沒有count屬性(或是沒有count這個global變數,在global context這兩件事是相等的),結果就是undefined。
關鍵是function(){...}.bind(this)
這個expression在哪個context執行。
Javascript只有三種Context:global, function, eval,並沒有物件的context這種東西。
恩恩我了解了,之前沒有context的概念,謝謝大大 :D
我的兩個this不一樣就是因為一個是在 global context ,另一個在 function context 。
this在javascript中,你永遠都不能將其當成變數來使用的。
真要說的話。它算是特殊應用式。
fillano大有跟你說很多了。所以你要能理解。
一般如果有跨區域的情況下,我都會用一個變數來處理。不會直接使用this。
this就多就是同領域下的情況下才會使用。
畢竟上面就有人說了。this是一件很博大精深的事。
認真來說,其實所有的語言都有this的應用方式。其道理都是一樣的東西。
只是javascript的變數領域比較奇特。