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

コンソールがこれは

未定義を返しますJavaScriptとnodejs ecma6にラムダで、それなしで同じように作用していないが言った:あなたは遅れるかもしれませんが、時間がないでしょう!

あなたが戻ってラムダから

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

}); 

を変更した場合、それは動作します。なぜこれが構文的な砂糖の変化と異なって機能するのか、私に説明することができますか?

+1

砂糖だけではないので、 '=>'は新しいコンテキストを作成せず、 'this'もありません。 –

+1

'function()'バージョンもラムダです。 – nnnnnn

+0

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

答えて

0

矢印機能(ラムダ)は、thisでもargumentsでもありません。 thisまたはargumentsが見つかった場合は、その関数呼び出し元に属します。

したがって、この機能をサポートするためには、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

私は知っていた、彼の要求のために尋ねる –

+1

@AbdennourTOUMIあなたの答えをありがとうが、私は何も必要なかった。なぜ私は理解していない方法でjavascriptが動作しているのか尋ねました。私はC#から来ています。「矢印の機能」はこのように動作せず、実際には構文的な砂糖です。 –