var obj = {
say: function() {
function _say() {
console.log(this);
}
return _say.bind(obj);
}()
};
obj.say();
碼結果是註銷全局或窗口,我想知道爲什麼bind方法不綁定「這個」的obj對象的上下文?
var obj = {
say: function() {
function _say() {
console.log(this);
}
return _say.bind(obj);
}()
};
obj.say();
碼結果是註銷全局或窗口,我想知道爲什麼bind方法不綁定「這個」的obj對象的上下文?
在分配變量obj
仍然沒有任何價值。因此,您的綁定調用相當於.bind(undefined)
,其行爲與您觀察的方式相同。
更具體地講,this
指window
是因爲OrdinaryCallBindThis執行以下步驟(非嚴格模式):
[...]
If thisArgument is undefined or null, then
[...]
Let thisValue be globalEnvRec.[[GlobalThisValue]].
您可以在Chrome調試器[[BoundThis]]
確實undefined
您的通話後檢查。
您正在立即調用該函數。刪除say
函數後面的括號。如果你期望調用的函數沒有連續兩個括號obj.say()()
使用.call()
代替.bind()
var obj = {
say: function() {
function _say() {
console.log(this);
}
return _say.call(this);
}
};
obj.say();
這裏真正的問題是,如果你需要'this'綁定,你爲什麼不使用實際的對象與原型?你展示的代碼試圖將「實例邏輯」分成「無實例」代碼,你可以*這樣做,它是JavaScript,但它也真的......愚蠢?你究竟在做什麼*試圖使用這些代碼? (或者用這樣的代碼) –
(1)在'return _say.bind(obj);'行上放置一個斷點。 (2)當它停在那裏時,檢查'obj'的值。 (3)認真思考。 (4)解釋你的[橡皮鴨子](https://en.wikipedia.org/wiki/Rubber_duck_debugging)究竟爲什麼你試圖將一個IIFE的結果分配給「say」屬性。 – 2017-08-11 05:25:49
感謝您的意見,@Mike'Pomax'Kamermans。這段代碼只是一個練習,我想知道爲什麼'this'在使用bind(undefined)時是全局的。 – smallbone