8

javascript で "use strict" が期待どおりに機能しない興味深いケースを見つけました。以下の機能

"use strict";

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

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

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

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

4

1 に答える 1

11

MDN はアロー関数について次のように述べています。

厳格モードとの関係

それが語彙的であることを考えるとthis、に関する厳格なモード規則thisは単に無視されます。

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

レキシカルのルールはthis、厳密モードのthisルールよりも優先されます。

これは、ES2015 仕様で、関数の[[ThisMode]]slotlexicalの可能な値( 、strict、または) の平易な英語の説明を調べることで簡単に確認できますglobal

this関数の仮パラメーターとコード本体内で参照がどのように解釈されるかを定義します。は、字句的に囲んでいる関数の値を参照lexicalすることを意味します。関数の呼び出しによって提供されたとおりに値が使用されることを意味します。の値がグローバル オブジェクトへの参照として解釈されることを意味します。thisthisstrictthisglobalthisundefined

つまり、関数のthis動作は正格、非正格、または字句のいずれかです。関数が (アロー関数の場合のように) レキシカルである場合、 -setting 動作[[ThisMode]]を決定する目的で、関数の厳密/非厳密ステータスは無関係になります。this

于 2016-04-05T13:36:40.697 に答える