2016-04-05 5 views
6

"use strict"がjavascriptで期待通りに機能しないという面白いケースが見つかりました。 以下の機能Javascriptでstrictを使用して太い矢印には使用できませんか?

"use strict"; 

var y =() => { 
    console.log(this); 
} 

var x = function() { 
    console.log(this); 
} 

x(); // undefined due to use strict 
y(); // window object 

私は太っ矢印コンテキストは未定義で上書きする必要がある、または私の仮定が間違っていると思いますか?

+1

グローバルスコープ( 'this'は' window'オブジェクトです)でこれを実行しているので、矢印関数の 'this'は字句ですが、これについて予期しないことはありませんか? – Bergi

答えて

7

MDNはarrow functionsの言う:strictモードで

関係が

thisは、thisに関して厳格モードのルールは単に無視されている字句であることを考えます。

var f =() => {'use strict'; return this}; 
f() === window; // or the global object 
this

語彙の規則が厳密モードthisルールよりも優先されます。

我々はlexicalstrict、またはglobalすることができa function's [[ThisMode]] slotのための可能な値の平易な英語の記述を、調べることにより、ES2015の仕様でこれを簡単に見ることができます:

this参照が内部に解釈される方法を定義します関数の正式なパラメータとコード本体。 lexicalは、thisが語彙的に囲む機能の値をとすることを意味します。 strictは、thisの値が、関数の呼び出しによって提供されたとおりに正確に使用されることを意味します。 globalは、の値がグローバルオブジェクトへの参照として解釈されることを意味します。言い換えれば

、機能のthis挙動はどちらか、厳格な非厳密、または字句ことができます。関数の[[ThisMode]]が字句の場合(矢印関数の場合のように)、thisの設定動作を決定するために、関数の厳密な/厳密でない状態を無関係にします。

関連する問題