Использование метода класса в глобальном контексте имеет значение this как неопределенное - PullRequest
2 голосов
/ 07 июля 2019

У меня есть класс, в котором есть метод, который использует this.Я «обновил» экземпляр этого объекта и передал его метод переменной в глобальном контексте.Если я тогда вызываю мою глобальную функцию, то this не определено.

class Tests {
  logThis() {
     console.log(this);
  }
}

const globalFunc = new Test().logThis;

globalFunc(); // undefined

Теперь, если я только что использовал литерал объекта, то this is global.

const someObject= {
    logThis2: function() {console.log(this)}
}

const globalFunc2 = someObject.logThis2;

globalFunc2(); // global object

В обоих случаях глобальный объект владеет кодом и должен предоставлять this в контексте выполнения globalFunc.Так почему же разница в this для метода, сгенерированного классом?

1 Ответ

2 голосов
/ 07 июля 2019

Все class, включая их методы, оцениваются в строгом режиме¹. Всякий раз, когда функция создается, и «ее тело находится в строгом режиме» ², внутреннее свойство [[mode]] функции устанавливается на «строгий». Это тогда даст this значение undefined, когда функция будет вызвана без контекста.


Соответствующие цитаты из спецификации:

1

Все части ClassDeclaration или ClassExpression имеют строгий код режима

~ ES 262, 10.2.1 Код строгого режима


2

  1. Если код функции для этого MethodDefinition является кодом режима строгого режима, пусть strict будет true. В противном случае пусть строгий будет ложным.

[...]

  1. Пусть closure будет FunctionCreate (вид, UniqueFormalParameters, FunctionBody, область действия, строгий, прототип).

  2. Выполнить MakeMethod (замыкание, объект).

~ ES 262, 14.3.7 Семантика времени выполнения: DefineMethod

...