Подтвердить что ты не робот

Node.js объявление переменной и область действия

Когда я набираю это в node.js, я получаю undefined.

var testContext = 15;
function testFunction() {
  console.log(this.testContext);
}
testFunction();
=>undefined

Без ключевого слова var оно проходит (= > 15). Он работает в консоли Chrome (с ключевым словом var и без него).

4b9b3361

Ответ 1

Он не работает в Node при использовании var, потому что testContext является локальным для текущего модуля. Вы должны ссылаться на него напрямую: console.log(testContext);.

Если вы не наберете var, произойдет следующее: testContext теперь глобальный var во всем процессе Node.

В Chrome (или в любом другом браузере - ну, я не уверен в oldIE...), не имеет значения, используете ли вы var или нет в своем примере, testContext перейдет к глобальный контекст, который window.

Кстати, "глобальный контекст" является значением по умолчанию this вызовов функций в JS.

Ответ 2

Ключевым отличием является то, что все модули (script files) в Node.js выполняются в их собственном closure в то время как Chrome и другие браузеры выполняют все script файлы непосредственно в глобальной области.

Это упоминается в Документация Globals:

Некоторые из этих объектов фактически не находятся в глобальной области видимости, а в области модуля - это будет отмечено.

var, объявленный в модуле Node, будет изолирован от одного из этих закрытий, поэтому вы должны экспортировать элементы для других модулей для их достижения.

Хотя при вызове function без определенного контекста обычно будет по умолчанию присвоен глобальный объект, который удобно назвать global в Node.

function testFunction() {
    return this;
}

console.log(testFunction() === global); // true

И без var, чтобы объявить его, testContext по умолчанию будет определяемым как глобальный.

testContext = 15;
console.log(global.testContext); // 15

Ответ 3

Как указано в документе

var что-то внутри модуля Node.js будет локальным для этого модуля.

Итак, это будет отличаться, поскольку var testContext находится в контексте модуля, а контекст этого - global.

В качестве альтернативы вы можете использовать:

global.testContext = 15;
function testFunction() {
  console.log(this.testContext);
}
testFunction();

Ответ 4

Я полагаю, что проблема связана с ключевым словом this. Если вы выполните console.log(this), вы увидите, что testContext не определен. Вы можете попробовать:

this.testContext = 15;
function testFunction() {
  console.log(this.testContext);
}
testFunction();