Здравствуйте, есть вопрос, имеется такой код.
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
Комментариев нет:
Отправить комментарий