Значение ключевого слова `this` функции, возвращаемой получателем - PullRequest
15 голосов
/ 19 января 2020

Я обнаружил неожиданное значение этого ключевого слова в следующем примере:

let x = {
    z : 10 ,
    get func1() {
        return function(v) {
            console.log(this === v);
        }
    }
}


x.func1(x)

Значение этого ключевого слова является объектом x , как будто оно выполняется из этого объекта, я ожидаю только get функция , которая имеет это ключевое слово равно вызывающему объекту x

этот пример показывает нам разницу

let x = {
    func2() {
        return function(v) {
            console.log(this === v);
        }
    }
}

x.func2()(x);

В обоих примерах func1 , который является функцией-получателем, и func2 , который является методом объекта, выполняются из объект x , и возвращаемая функция затем выполняется. Так почему это значение в первом примере не равно глобальному объекту вместо объекта x .

1 Ответ

13 голосов
/ 19 января 2020

Это очень интересный вопрос.

Это потому, что функция вызывается сразу после получения доступа к свойству. Таким образом, они в основном эквивалентны:

let x = {
    get func1() {
        return function(v) {
            console.log(this === v);
        };
    },
    func2(v) {
        console.log(this === v);
    }
};

x.func1(x);
x.func2(x);

В обоих случаях:

  1. Считывается значение свойства, что приводит к ссылке на функцию.
  2. Эта функция выполняется как часть того же выражения доступа к свойству.

Тот факт, что func1 является свойством доступа, а func2 является свойством данных, не имеет значения. Важно то, как используется значение, полученное в результате чтения свойства.

...