2016-08-01 33 views
0
var emitter = require('events').EventEmitter; 
var util = require('util'); 

let Person = function (name) { 
    this.name = name; 

}; 

util.inherits(Person, emitter); 
let p = new Person("jonny"); 

p.on('speak', (said) => { 
    console.log(` ${this.name} said: ${said}`); 

}); 

p.emit('speak', "You may delay but time will not!"); 

控制檯將返回這不採取同樣的拉姆達沒有它在ecma6 JavaScript和的NodeJS

不確定的說:你可以推遲但時間不會!

如果從拉姆達變化回來

p.on('speak', function(said) { 
    console.log(` ${this.name} said: ${said}`); 

}); 

它的工作原理。可以向我解釋爲什麼這種行爲與語法糖變化有所不同?

+1

因爲不僅是糖。 '=>'不會創建新的上下文,並且沒有'this'。 –

+1

'function()'版本也是lambda。 – nnnnnn

+0

http://stackoverflow.com/documentation/javascript/186/functions/720/arrow-functions#t=201608012207550133428 –

回答

0

箭頭函數(Lambda)既沒有this也沒有arguments。如果您發現thisarguments,它屬於它的函數調用者。

因此,您需要使用經典功能,直到支持此功能的升級events package &。

更新:

如果你愛箭頭功能&你堅持使用它,我建議重寫on方法以及使用轉換箭頭功能,經典的功能eval

class Person extends require('events').EventEmitter{ 

    constructor(name){ 
     super(); 
     this.name=name; 
    } 
    on(event,arrow){ 
     super.on.call(this,event,eval(`(function${arrow.toString().replace('=>','')})`)); 
    } 
} 

let p = new Person("jonny"); 

p.on('speak', (said) => { 
    console.log(` ${this.name} said: ${said}`); 

}); 

p.emit('speak', "You may delay but time will not!"); 

DEMO:

enter image description here

+0

請不要推薦'eval',那根本不是一般的答案。如果這個函數依賴於'this'和'said'之外的任何東西,它會立即崩潰。 – loganfsmyth

+0

我知道,,, hust他的要求 –

+1

@AbdennourTOUMI謝謝你的回答,但我什麼都不需要。我問爲什麼JavaScript的行爲方式我不明白。我來自C#,其中「箭頭函數」不以這種方式行事,實際上是語法糖。 –