簡體   English   中英

綁定函數的怪異行為

[英]Weird behavior of bound function

有人可以解釋這里發生了什么嗎?

var dog = {
   name: "Dogo"
}

var echo = function() {
    console.log(this);
}

dog.echo = echo.bind(this);

echo();
dog.echo();

第一個echo()按預期打印出全局對象。 但是,第二個打印的空對象{}與第一個echo()打印的內容不符。 為什么?

編輯:對不起! 我沒有提到代碼是由nodejs解釋器運行的!

謝謝你的幫助。

在nodejs模塊的主要范圍內, this變量引用module.exports ,默認情況下它等於空對象{} ,您可以通過運行以下樹行來證明這一點

console.log(this === module.exports);
module.exports.a = "a";
console.log(this);

和輸出應該是

true
{ a: 'a' }

這就是為什么您在第二次調用中得到空對象的原因


但是在模塊的函數內部, this變量引用nodejs的global變量 ,以證明它可以像下面那樣創建一個模塊並運行它

global.bar = "baz";
function foo() {
    console.log(this === global);
    console.log(global.bar);
}
foo();

和輸出應該是

true
baz

這就是為什么您在第一個電話中找到正確的對象的原因

javascript中的綁定功能是更改“ this”所指向的上下文。

如果要在echo函數中將“ this”設置為創建的dog對象,則應將dog作為綁定參數。

dog.echo = echo.bind(dog);

在代碼行上方,更改echo函數中“ this”指向的內容。 所以現在它將指向狗。

這是代碼的初始結果: 在此處輸入圖片說明

在這兩種情況下,回顯中的“ this”都指向全局對象。

現在,一旦您提供dog作為要綁定的參數,這里就是結果。 如您所見,第二個console.log的“ this”已更改。 它指向狗的對象。 在此處輸入圖片說明

Javascript應該在瀏覽器和服務器端(大多數時間)以某種方式運行。 Node建立在javascript之上。 它使用相同的v8引擎來編譯javascript代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM