what's the difference between Browsers and Node? for instance:
setName.js
on Node:
var setName;
setName = function (name) {
return this.name = name;
};
setName("LuLu");
//LuLu
console.log(name);
//undefined
console.log(this.name);
setName.html
in browser:
<script>
var setName;
setName = function (name) {
return this.name = name;
};
setName("LuLu");
//LuLu
console.log(name);
//LuLu
console.log(this.name);
</script>
the the second log is different,why?
Node is a JavaScript engine, not a browser. The specific reason that you see undefined
in Node, and Lulu
in a browser? Differences in the global namespace:
In browsers, the top-level scope is the global scope. That means that in browsers if you're in the global scope
var something
will define a global variable. In Node this is different. The top-level scope is not the global scope;var something
inside a Node module will be local to that module.
In the browser, this
is a reference to the window
object — the browser's global namespace — for all functions which are invoked unattached to an object (e.g. not like foo.bar()
). In Node, this
is simply not a reference to the global namespace.
N.B. console.log(this.name)
in a Node interpreter will print Lulu
, not undefined
. That's because, in the REPL only,
> this === global
true
Further reading @ How To Node: What is "this?"
Okay, one more edit as prompted by @Šime Vidas' comment regarding this
in ES5 strict mode:
- In the global context (outside of any function),
this
refers to the global object, whether in strict mode or not.- When the
this
keyword occurs inside a function, its value depends on how the function is called.- When a function is called as a method of an object, its
this
is set to the object the method is called on.
More interesting reading courtesy of Juriy Zaytsev (aka @kangax) in one of his blog posts.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With