Почему результат отличается в консоли Chrome и возвышенном? Это в JS

Я узнаю об этом идентификаторе и знаю, что когда функция не вызывается для объекта, это относится к объекту окна в нестрогом режиме. В результате я ожидаю, что this.bar будет регистрировать "что угодно".

"что угодно" - это вывод, когда я запускаю свой код в Chrome console.it, но вывод не определен, когда я запускаю свой код, используя систему сборки узлов в возвышенном состоянии.

Почему это так? Я прав, что результат в консоли Chrome правильный? Когда еще я мог столкнуться с такими проблемами?

Вот мой код

function foo() {
    // console.log(this)
    console.log( this.bar );
}

var bar = "whatever";


// --------

foo();              // OUTPUT is "whatever" in the Chrome console and OUTPUT is undefined in Sublime's Node build system.

3 ответа

Решение

Когда вы используете this в функции без указания другого контекста она ссылается на глобальный объект. В Chrome это будет window объект. В узле это называется global, Когда я говорю, указывая другой контекст, это будет, например, использование new для конструктора, или call а также apply функции для привязки конкретного this,

Основное отличие заключается в том, что при использовании var bar = "whatever"; в узле, использование var определяет переменную для модуля, который вы пишете, а не для всего процесса Node. В Chrome вы просматриваете его в глобальном масштабе. window объект. Это то же самое, что опустить var в целом.

Ниже я добавил несколько примеров, касающихся области видимости, просто чтобы сделать его немного понятнее. Игра в консоли - отличный способ открыть для себя такие вещи.

Пример 1: Пример 1 Как видите, звонит test() создал глобальную сферу x переменная и this установлено, что имеется в виду window переменная.

Пример 2: Пример 2 В этом примере мы создали новый экземпляр, который создает новую область видимости. x переменная не ограничена глобально. Единственный способ получить к нему доступ - использовать myInstance контекст.

Что касается вашей проблемы, у вас есть два варианта:

Вариант 1 (рекомендуется): поскольку бар не имеет глобальной области видимости, вы не хотите получать доступ к глобальной переменной, используя this

var bar = "whatever";

function foo() {
    console.log(bar);
}

Вариант 2 (не рекомендуется): эта переменная будет находиться в глобальной области видимости, поэтому вы можете использовать this или же global

global.bar = "whatever";

function foo() {
    console.log(this.bar); // console.log(global.bar);
}

Я не уверен на 100%, но я предполагаю, что это как-то связано с объектом Window. Определенная вами функция принадлежит объекту Global Window. Возможно, система сборки узлов не имеет этого глобального объекта.

Когда вы объявляете переменную в узле, как это var bar = 'something' Вы объявляете это не глобальным, а областью действия модуля. Вы должны использовать global объект для объявления глобальной переменной. Что-то вроде этого:

global.bar = 'something';
Другие вопросы по тегам