2017-08-11 42 views
3

的JavaScript綁定方法似乎未正常工作

var obj = { 
 
    say: function() { 
 
     function _say() { 
 
      console.log(this); 
 
     } 
 
     return _say.bind(obj); 
 
    }() 
 
}; 
 

 
obj.say();

碼結果是註銷全局或窗口,我想知道爲什麼bind方法不綁定「這個」的obj對象的上下文?

+0

這裏真正的問題是,如果你需要'this'綁定,你爲什麼不使用實際的對象與原型?你展示的代碼試圖將「實例邏輯」分成「無實例」代碼,你可以*這樣做,它是JavaScript,但它也真的......愚蠢?你究竟在做什麼*試圖使用這些代碼? (或者用這樣的代碼) –

+0

(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

+0

感謝您的意見,@Mike'Pomax'Kamermans。這段代碼只是一個練習,我想知道爲什麼'this'在使用bind(undefined)時是全局的。 – smallbone

回答

1

在分配變量obj仍然沒有任何價值。因此,您的綁定調用相當於.bind(undefined),其行爲與您觀察的方式相同。

更具體地講,thiswindow是因爲OrdinaryCallBindThis執行以下步驟(非嚴格模式):

[...] 
If thisArgument is undefined or null, then 
[...] 
Let thisValue be globalEnvRec.[[GlobalThisValue]]. 

您可以在Chrome調試器[[BoundThis]]確實undefined您的通話後檢查。

+0

感謝您的答案,@ASDGerte。但是,如果_say函數將'this'綁定到'undefined',爲什麼obj.say()中的'this'綁定到global/window而不是obj? – smallbone

+0

@smallbone編輯。我只是在回答以後尋找那個:) – ASDFGerte

+0

我明白了!非常感謝。 – smallbone

0

您正在立即調用該函數。刪除say函數後面的括號。如果你期望調用的函數沒有連續兩個括號obj.say()()使用.call()代替.bind()

var obj = { 
 
    say: function() { 
 
    function _say() { 
 
     console.log(this); 
 
    } 
 
    return _say.call(this); 
 
    } 
 
}; 
 

 
obj.say();

相關問題