2016-08-01 12 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!"); 

Konsoledies wirkt nicht das gleiche in Lambda und ohne es in ecma6 Javascript und NodeJS

undefined sagte zurück: Sie verzögern, aber die Zeit wird nicht!

, wenn Sie von Lambda ändern zurück

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

}); 

es funktioniert. Kann mir jemand erklären, warum sich das bei syntaktischen Zuckerveränderungen anders verhält?

+1

Weil ist nicht nur Zucker. '=>' erzeugt keinen neuen Kontext und hat nicht 'this'. –

+1

Die 'function()' Version ist auch ein Lambda. – nnnnnn

+0

http://StackOverflow.com/Documentation/Javascript/186/Functions/720/Arrow-Functions#T=201608012207550133428 –

Antwort

0

Pfeilfunktion (Lambda) hat weder this noch arguments. Und wenn Sie this oder arguments finden, gehört es zu seiner Funktion Anrufer.

Daher müssen Sie die klassische Funktion bis zur Aktualisierung events package & verwenden, die diese Funktion unterstützt.

Update:

WENN Sie Pfeil Funktion lieben & Sie bestehen darauf, es zu benutzen, schlage ich vor on Methode außer Kraft zu setzen und Pfeil-Funktion im klassischen Funktion 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 konvertieren:

enter image description here

+0

Bitte nicht "eval" empfehlen, das ist überhaupt nicht eine allgemeine Antwort. Wenn diese Funktion von etwas außer 'diesem 'und' besagtem' abhing, würde sie sofort brechen. – loganfsmyth

+0

ich wusste ,,, hust für seine Anforderungen –

+1

@AbdennourTOUMI danke für Ihre Antwort, aber ich brauchte nichts. Ich habe gefragt, warum Javascript sich so verhält, dass ich es nicht verstehe. Ich komme aus C#, wo "Pfeilfunktionen" nicht auf diese Weise wirken und tatsächlich syntaktischer Zucker sind. –