2017-05-06 74 views
1

雖然在https://nodejs.org/api/events.html閱讀的NodeJS的文檔,我有點困惑this區域的事件監聽器處理這樣的:的NodeJS:傳遞參數,這給聽衆

「這是可以使用ES6箭頭函數作爲監聽器然而,這樣做的時候,該this關鍵字將不再引用EventEmitter實例:」

const myEmitter = new MyEmitter(); 
myEmitter.on('event', (a, b) => { 
    console.log(a, b, this); 
    // Prints: a b {} 
}); 
myEmitter.emit('event', 'a', 'b'); 

this代表的對象是空的。請在箭頭功能中提到什麼?

+0

'此'綁定已被放棄在箭頭函數中。它應該讓它更容易地休閒一下。 – magreenberg

+1

箭頭函數與封閉範圍共享相同的上下文。在案件中使用適當的功能。 – shanks

回答

1

做進一步的研究:在模塊腳本

thisexports模塊範圍內。 this在REPL中指的是global對象。

看着香巴蘭巴拉答案。在嚴格模式下的IIFE中的this未定義,在標準模式下它是全局對象。

來自:Why console.log(this) in node return empty object?作者:T.J. Crowder

因爲NodeJS在一個模塊中運行你的代碼,並且它引用了它爲你的模塊導出創建的對象(它也是它爲你提供的模塊變量的exports屬性)。 (因爲他們沒有真正提的是,模塊文檔,我懷疑使用它可能不是一個好主意 - 用出口來代替。)

但你的代碼調用IIFE與此指的是全局對象調用它,因爲在鬆散(非嚴格)模式下,不通過對象屬性調用普通函數將其設置爲全局對象。 (在嚴格模式下,這將在此處未定義。)

爲什麼this在嚴格模式下的IIFE中變得未定義?

來源:Why is "this" in an anonymous function undefined when using strict?通過jAndy

這是因爲,直到EcmaScript的262五門版,有一個很大的困惑,如果誰在那裏使用構造格局的人,忘了使用new關鍵字。如果您在ES3中調用構造函數時忘記使用new,則會引用全局對象(瀏覽器中的窗口),並且會使用變量來打開全局對象。

這是非常可怕的行爲,所以ECMA的人們決定將其設置爲undefined。

1

正如在評論中指出的那樣,箭頭函數中的this表示包含箭頭函數的作用域的上下文。

下面是一個例子:

const EventEmitter = require('events') 
const myEmitter = new EventEmitter(); 

this.foo = "bar"; 

myEmitter.on('event',() => { 
    console.log(this); // { foo: "bar" } 
}); 

(function() { 
    this.foo = "baz"; 
    myEmitter.emit('event'); 
})(); 
+0

感謝您的回覆。當使用「嚴格模式」時,TypeError被拋出,說'TypeError:不能設置未定義的屬性'foo' – decahub

1

直到箭頭的功能,每一個新的功能定義自己的this價值。事實證明,這是一種面向對象的編程風格。

An arrow function不會創建它自己的這個上下文,所以這有它的原始含義從封閉的上下文。因此,下面的代碼按預期工作:

function Person(){ 
    this.age = 0; 

    setInterval(() => { 
    this.age++; // |this| properly refers to the person object 
    }, 1000); 
} 

var p = new Person(); 

有關詳細信息check herehere too

可以綁定this箭頭的功能,嘗試結合該副

myEmitter.on('event', (a, b) => { 
    console.log(a, b, this); 
    // Prints: a b {} 
}.bind(this)); 
+1

感謝您的迴應。我瞭解'this'的背景。我只是想知道爲什麼它是一個空洞的對象。我一直在想'這個'會引用一個全局對象,但事實並非如此。在香巴蘭巴拉給我們的例子中,在IIFE中,這個'未定義'。 – decahub