Разная обработка '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,

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