Использовать строгий в 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
поведение