在下面的代碼中,第一個函數沒有綁定到obj
,但第二個函數是,所以f()
返回fifi
和g()
返回Mark Twain
如預期。但第三次嘗試,首先是(obj.getCallBack)
,現在是一個函數,然後調用它,本質上它應該與f
的情況相同。但他們確實打印出Mark Twain
。爲什麼他們沒有使用bind()
綁定到obj
,但仍然執行this
指向obj
?在Javascript上,爲什麼沒有使用bind()綁定的函數仍然綁定到對象?
(第4次嘗試只是方法的一般調用,而this
應該綁定到調用該方法的對象)。
(在目前的Chrome,Firefox和IE 9測試)
window.name = "fifi";
var obj = {
name: "Mark Twain",
getCallBack: function() {
return this.name;
}
}
var f = obj.getCallBack;
var g = f.bind(obj);
console.log(f);
console.log(f());
console.log(g);
console.log(g());
console.log((obj.getCallBack)());
console.log(obj.getCallBack());
但我認爲當使用'(obj.getCallBack)'時,它只是表示一個函數,而沒有評估過「this」是什麼。也就是說,它只是函數的靜態文本定義。所以我的意思是,'這'是作爲文本,但沒有評估。然後當使用'()'調用時,它將作爲函數調用。除非你說'this'被評估,那麼這應該意味着'this.name'也被評估了,所以它應該已經是'Mark Twain'了。 –
@動靜能量'(obj.fn)()'和'obj。fn()'是一回事。 '(obj.fn)()' - >'obj.fn()' - >函數被稱爲'obj.'的屬性' – Esailija
'console.log(f ===(obj.getCallBack) );'會打印出真實的,而調用它們會得到不同的結果。也許比較不考慮約束力 –