Страницы

Поиск по вопросам

вторник, 9 июля 2019 г.

Контекст в ноде при исполнении файла

Здравствуйте, есть вопрос, имеется такой код.
var obj = { num: 10, method: function(){ function test(){ console.log(this.num); } test(); } } obj.method(); // undefined
Он вернёт undefinded т.к контекст вызова функции test глобален. Но если мы в начале объявим переменную num и присвоем ей значение. То будет выведен результат глобального контекста.
var num = 11; var obj = { num: 10, method: function(){ function test(){ console.log(this.num); } test() } } obj.method(); //11
Проверял в ноде и браузере и оно работает. Но в ноде работает только в режиме REPL, а если я скармливаю ему скрипт из файла то возвращает результат undefined, можете пожалуйста подсказать почему так происходит?


Ответ

Отличие nodejs от браузера в том, что она уже поддерживает модули в javascript.
Важное отличие модулей заключается в том, что переменные объявленные с помощью var глобально для модуля - добавляются не в глобальный объект, а в модуль.
Любой файл расценивается как модуль, поэтому при использовании одного и того же кода в REPL и загружая из файла можно получить неожиданные результаты.
В приведенном коде можно отметить, что this внутри функции test указывается на глобальный объект (window в браузере, global в node).
При выполнении кода в браузере или REPL переменная num добавлялась в глобальный объект, и ее значение можно было получить через this
При загрузке же из файла, переменная добавляется в модуль, а не в глобальный объект поэтому ее значение нельзя было получить через this

Комментариев нет:

Отправить комментарий