第二個函數調用不會發生從一個對象的上下文,而是從功能,從第一個調用返回。
由於沒有對象上下文,所以this
的值與其他函數一樣成爲默認window
。
// v-----------------v------function has context
alert(object.getNameFunc()());
// -----------^----second function was returned from the first
// and invoked so there's no object context
如果我們不是分配返回的功能object
,然後從上下文中調用它,this
將被以object
參考。
obj.foo = object.getNameFunc();
obj.foo(); // "My Object"
完全相同的功能,但現在它正從爲object
一個屬性,它含蓄地將其this
價值object
調用。
的this
規則真的非常簡單和容易理解,但可能不是你所期望的第一什麼。
this
值非常動態,完全基於如何調用函數。
foo(); // 'this' is 'window'
object.foo(); // 'this' is 'object'
foo.call(object); // 'this' is 'object'
foo.apply(object);// 'this' is 'object'
var bar = foo.bind(object);
bar(); // 'this' is 'object'
所以你可以看到,默認爲window
當函數沒有任何類型的連接到另一個對象的調用。
但是,當我們將函數作爲對象的屬性調用時,this
突然引用該對象。
或者我們可以使用.call
,.apply
或.bind
來手動設置函數調用的this
值。
如果沒有對象上下文,則此值將成爲默認窗口。謝謝 – SeasonHuang
不客氣。 –