4

chrome version 49.0.2623.110 m

node v5.10.0

Here is my code:

var a = 0;

(function() {
    this.a = 1;
    this.b = 2;
    console.log(a);
} )();

console.log(a);
console.log(b);

chrome gives

1
1
2

node gives

0
0
2

Why does that happen?

Thanks

1
  • 1
    It has nothing to do with V8, but the way global scope works in Node, and in browsers (where the global scope is window). Try console logging this, and it should become clear. Commented Apr 4, 2016 at 16:44

1 Answer 1

11

When a function is called without context (and you are running in non-strict mode) this defaults to the global object.

In a browser the top-level of your source code runs in the global context, so this.a, which is window.a is the same as the var a declared in the global context at the top. Assigning this.a = 1 is the same as assigning a = 1.

In node.js each JavaScript file gets its own module context that is separate from the global context, so var a = 0; is not creating a global, and the global you created with this.a = 1; will be shadowed by the modules own a.

Sign up to request clarification or add additional context in comments.

3 Comments

So in node console.log(b); goes up in the scope chain to get b, from module to global. Whereas in the browser the code is executed directly in the global scope.
In node the code is in the module scope whereas in the browser the code is the global scope. Thanks.
@EuInsumiPrunc Yes, b is the same in both because there is no b declared in the module to shadow the global.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.