Это значение функции стрелки, используемой в качестве выражения функции или метода объекта
Другая тема на 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
.)