Это значение функции стрелки, используемой в качестве выражения функции или метода объекта

Другая тема на arrow functions и это значение, но я не могу найти ответ на код, который смущает меня.

Когда я запускаю этот код в консоли браузера, результат верен:

var f = () => { return this; };
f() === window;                // true
f()                            // Window

Но когда я запускаю один и тот же код в Node, я получаю другой результат:

var f = () => { return this; };
console.log(f() === global);    // false
console.log(f() === undefined); // false
console.log(f());               // {}

Также, когда объект определен:

let button = {
    isClicked: false,
    click: () => { this.isClicked = true }
}

console.log(button.isClicked);   // false
button.click();
console.log(button.isClicked);   // false

Когда эта строка выполняется в узле, результат не определен:

console.log(global.isClicked);   // undefined

Но когда выполняется в браузере, результат верен:

console.log(window.isClicked);    // true

Почему, когда код выполняется в браузере, это относится к объекту окна, но при выполнении в Node это не относится к глобальному?

1 ответ

Решение

Но когда я запускаю один и тот же код в Node, я получаю другой результат:

Правильно. Код в узле не запускается в глобальной области видимости, он запускается в области, созданной для "модуля" узла, где this не относится к глобальному объекту, это относится к экспорту для модуля (иначе module.exports). Подробнее о модулях Node здесь.

Также, когда объект определен

this не имеет другого значения в инициализаторе объекта. Ваш пример кода:

let button = {
    isClicked: false,
    click: () => { this.isClicked = true }
};

... делает именно то, что делает этот код:

let button = {
    isClicked: false
};
button.click = () => { this.isClicked = true };

В обоих случаях click функция закрывается this как это где мы создаем button, this не изменяет значение в инициализаторе, но этот код предполагает, что это делает (в частности, код предполагает this становится ссылкой на создаваемый объект, чего не происходит; на самом деле, нет никакого способа сослаться на объект, создаваемый из инициализатора).

(Самое простое решение в этом конкретном случае было бы использовать button вместо this, так как функция также закрывается button.)

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