web-dev-qa-db-fra.com

Déclaration et portée de la variable Node.js

Lorsque je tape ceci dans node.js, j'obtiens undefined.

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

Sans le mot clé var, il passe (=> 15). Cela fonctionne dans la console Chrome console (avec et sans mot clé var)).

36
IGRACH

Cela ne fonctionne pas dans Node lors de l'utilisation de var car testContext est un local du module actuel. Vous devez le référencer directement: console.log(testContext);.

Lorsque vous ne tapez pas var, ce qui se passe est que testContext est maintenant ne var globale dans l'ensemble du processus Node.

Dans Chrome (ou tout autre navigateur - enfin, je ne suis pas sûr de oldIE ...), peu importe si vous utilisez var ou non dans votre exemple, testContextira dans le contexte global, qui est window.

Par ailleurs, le "contexte global" est le this par défaut des appels de fonction dans JS.

48
gustavohenke

La principale différence est que tous les modules (fichiers de script) dans Node.js sont exécutés dans leur propre fermeture tandis que Chrome et d'autres navigateurs exécutent tous les fichiers de script directement dans le global portée.

Ceci est mentionné dans la documentation Globals :

Certains de ces objets ne sont pas réellement dans la portée globale mais dans la portée du module - cela sera noté.

Les vars que vous déclarez dans un module Node sera isolé de l'une de ces fermetures, c'est pourquoi vous devez exporter les membres pour que les autres modules les atteindre.

Cependant, lors de l'appel d'un function sans contexte spécifique, il sera normalement par défaut à l'objet global - qui est commodément appelé - global dans Node.

function testFunction() {
    return this;
}

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

Et, sans le var pour le déclarer, testContext sera par défaut défini comme un global .

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

Comme mentionné dans le document

var quelque chose à l'intérieur d'un module Node.js sera local à ce module.

Donc, ça va être différent car le var testContext est dans le contexte du module et le contexte est global.

Vous pouvez également utiliser:

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

Je pense que le problème est lié à la clé this Word. Si vous faites console.log(this), vous verrez que testContext n'est pas défini. Vous voudrez peut-être essayer:

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