2017-05-06 9 views
1

に引数とこれを渡す、私はイベントリスナーでこれを扱うのthis面積について少し混乱しています:NodeJS:<a href="https://nodejs.org/api/events.html" rel="nofollow noreferrer">https://nodejs.org/api/events.html</a>でNodeJSのためのドキュメントを読んでいる間、リスナー

「リスナーとしてES6アローの機能を使用することが可能ですそうする際に、しかし、thisキーワードはもはやEventEmitterインスタンスを参照しません:」thisが表す

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

オブジェクトが空です。矢印の機能の中でこの参照は何を意味しますか?

+0

'this'バインディングは矢印の機能で削除されました。それは、oopスタイルを休めることをより簡単にするはずです。 – magreenberg

+1

矢印機能は、囲みスコープと同じコンテキストを共有します。この場合、適切な機能を使用してください。 – shanks

答えて

1

を副結合試してみてください、機能を矢印thisをバインドすることができます。モジュールのスクリプトで

thisは、モジュールのスコープ内exportsを指します。 REPLの thisは、globalオブジェクトを指します。

shambalambala答えを見る。厳密モードのIIFE内のthisは未定義であり、標準モードではグローバルオブジェクトです。

から:Why console.log(this) in node return empty object? by T.J. Crowder

NodeJSはモジュール内でコードを実行するため、モジュールのエクスポート用に作成したオブジェクトを参照します(これはモジュール変数のexportsプロパティでもあります)。 (実際にはモジュールのドキュメントで言及していないので、おそらくそれを使うのは良い考えではないと思われます。代わりに輸出を使用してください)

しかし、IIFEを呼び出すコードは、緩い(厳密ではない)モードでは、オブジェクトプロパティではない通常の関数を呼び出すと、このオブジェクトをグローバルオブジェクトに設定して呼び出すためです。 (厳密なモードでは、これはそこでは定義されません)

はIIFEのStrictモードでは定義されないのはなぜですか?

から:コンストラクタパターンを使用している人々は、新しいキーワードを使用するのを忘れた場合のECMAScript 262版5まで、大きな混乱があった、ためですWhy is "this" in an anonymous function undefined when using strict?

jAndy

によります。 ES3でコンストラクタ関数を呼び出すときにnewを使用するのを忘れた場合、これはグローバルオブジェクト(ブラウザのウィンドウ)を参照し、変数を使用してグローバルオブジェクトを壊してしまいます。

ECMAの人々はひどい振る舞いで、これを未定義に設定しました。

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は、このコンテキストを独自に作成しないため、これは囲むコンテキストの元の意味を持ちます。したがって、次のコードは期待通りに動作します。詳細check herehere tooについては

function Person(){ 
    this.age = 0; 

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

var p = new Person(); 

あなたは、これはさらなる研究を行う

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

あなたの応答に感謝します。私は 'this'の文脈を理解しています。なぜそれが空のオブジェクトであるのか不思議です。私は 'this'がグローバルオブジェクトを参照すると考えていましたが、そうではありません。 shambalambalaが私たちに与えた例では、IIFEの中で、「this」は「未定義」です。 – decahub

関連する問題

 関連する問題