Разная обработка 'this' в Node.js и Browser
У меня Node.js v8.10.0 локально установлен. Я написал простой скрипт для игры с этим:
var x = 1;
var fn = function (a) {
var x = a;
console.log(`local x = ${x}`);
console.log(`global x = ${this.x}`);
}
fn(10);
Когда я выполняю скрипт через Node.js, я получаю следующий результат:
local x = 10
global x = undefined
Когда я выполняю скрипт в Chrome, я получаю следующий результат:
local x = 10
global x = 1
Не могли бы вы объяснить мне, почему Node.js не видит x в глобальной области видимости?
2 ответа
Не могли бы вы объяснить мне, почему Node.js не видит x в глобальной области видимости?
Это так, если вы запускаете его в консоли Node. Если вы запустите его в виде файла, x
находится в области видимости файла, а не в глобальной области видимости.
Кстати, в Node вы можете использовать global
явно видеть глобальную область, так же, как вы использовали бы window
в браузере. Таким образом,
console.log(global == this)
даст вам два разных ответа в зависимости от того, запускаете ли вы его в файле или в консоли.
Также попробуйте перейти на let
а также const
, Это очень запутанно, потому что var
ведет себя по-разному в глобальном масштабе и в других местах. В консоли и в браузере, ваш внешний var x
находится в глобальной области видимости, поэтому он определяет глобальную переменную (window.x
а также global.x
). В файле узла var x
не находится в глобальной области видимости, поэтому он делает то, что обычно делает, когда не в глобальной области видимости: определяет локальную переменную x
(не this.x
не global.x
, просто x
). Таким образом, у вас есть две локальные переменные, внутренняя скрывает внешнюю, что делает внешнюю недоступной. В то же время, this.x
никогда не был определен.
В хроме this
является объектом Window
как будто вы делаете this.constructor.name
ты получаешь Window
как имя конструктора, так при доступе this.x
он будет искать глобальную переменную x
и не ссылается на область действия функции.
var x = 1;
var fn = function (a) {
var x = a;
console.log(`local x = ${x}`);
console.log('Constructor ', this.constructor.name);
console.log(`global x = ${this.x}`);
}
fn(10);
Тем не менее, в NodeJS, this
всегда будет ссылаться на прототип функции (а не на глобальную область видимости). Таким образом, у вас нет никакой ценности x
связано с prototype
функции, так что это дает вам undefined
,