Использовать строгий в JavaScript не работает для жирной стрелки?

Я нашел интересный случай, когда "использование строгого" не работает, как ожидалось в JavaScript. Следующие функции

"use strict";

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

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

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

Я думаю, что контекст жирной стрелки также должен быть перезаписан неопределенным, или мое предположение неверно?

1 ответ

Решение

MDN говорит о функциях стрелок:

Отношение со строгим режимом

При условии this лексический, строгий режим правил в отношении this просто игнорируются.

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

Правила лексического this иметь приоритет над строгим режимом this правила.

Это легко увидеть в спецификации ES2015, изучив простое английское описание возможных значений для функции. [[ThisMode]] слот, который может быть lexical, strict, или же global:

Определяет как this ссылки интерпретируются в рамках формальных параметров и тела кода функции. lexical Значит это this относится к this значение лексически вмещающей функции. strict означает, что this значение используется в точности так, как это предусмотрено вызовом функции. global означает, что this ценность undefined интерпретируется как ссылка на глобальный объект.

Другими словами, функция this поведение может быть строгим, нестрогим или лексическим. Если функция [[ThisMode]] является лексическим (как и для функции со стрелкой), что делает строгий / нестрогий статус функции несоответствующим для определения this поведение

Другие вопросы по тегам