Node.js variable declaration and scope
When I type this in node.js, I get undefined
.
var testContext = 15;
function testFunction() {
console.log(this.testContext);
}
testFunction();
=>undefined
Without var
keyword, it passes (=>15). It's working in the Chrome console (with and without var
keyword).
It doesn't work in Node when using var
because testContext
is a local of the current module. You should reference it directly: console.log(testContext);
.
When you don't type var
, what happens is that testContext
is now a global var in the entire Node process.
In Chrome (or any other browser - well, I'm unsure about oldIE...), it doesn't matter if you use var
or not in your example, testContext
will go to the global context, which is window
.
By the way, the "global context" is the default this
of function calls in JS.
The key difference is that all modules (script files) in Node.js are executed in their own closure while Chrome and other browsers execute all script files directly within the global scope.
This is mentioned in the Globals documentation:
Some of these objects aren't actually in the global scope but in the module scope - this will be noted.
The var
s you declare in a Node module will be isolated to one of these closures, which is why you have to export members for other modules to reach them.
Though, when calling a function
without a specific context, it will normally be defaulted to the global object -- which is conveniently called global
in Node.
function testFunction() {
return this;
}
console.log(testFunction() === global); // true
And, without the var
to declare it, testContext
will default to being defined as a global.
testContext = 15;
console.log(global.testContext); // 15
As mentioned in the document
var something inside an Node.js module will be local to that module.
So, it is going to be different as the var testContext
is in module context and the context of this is global
.
You can alternatively, use:
global.testContext = 15;
function testFunction() {
console.log(this.testContext);
}
testFunction();