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
)).
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, testContext
ira dans le contexte global, qui est window
.
Par ailleurs, le "contexte global" est le this
par défaut des appels de fonction dans JS.
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 var
s 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
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();
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();