Почему результат отличается в консоли 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: Как видите, звонит test()
создал глобальную сферу x
переменная и this
установлено, что имеется в виду window
переменная.
Пример 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';