1.理解
this為晚綁定. 確定的值為最終調用時所依附的對象, 即xxx.yyy()文法. 沒有指定則為全域對象, 網頁中為window對象.
指派陳述式僅複製函數對象的引用. 函數定義時的綁定資訊將被丟棄.
2.實際
由於this於運行時會被改寫,一個常見的技巧是用var o_this = this, 然後通過閉包傳遞.
可以通過Funtion的apply方法手工綁定this, 類比C#中委託中的行為.
var g_prefix = "I'm a ", g_postfix = ".";
var g_says = function(prefix, postfix) {
alert(prefix + this.msg + postfix);
}
window.msg = "windoW";
var man = { msg: "maN", says: g_says, hisCat: { msg: "caT", says: g_says } }
g_says(g_prefix, g_postfix); // I'm a windoW.
man.says(g_prefix, g_postfix); // I'm a maN.
man.hisCat.says(g_prefix, g_postfix); // I'm a caT.
man.simulateCatSayingButFail = man.hisCat.says; // Want to simulate cats saying..
man.simulateCatSayingButFail(g_prefix, g_postfix); // ..but fails. The man is saying "I'm a maN."
// Really want to simulate cat saying?
Function.prototype.bind = function(obj) {
var o_this = this;
return function() {
return o_this.apply(obj, arguments);
};
}
man.simulateCatSaying = man.hisCat.says.bind(man.hisCat); // Want to simulate cats saying..
man.simulateCatSaying(g_prefix, g_postfix); // ..Now saying "I'm a caT."