简体   繁体   中英

what's the difference between Browsers and Node?

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 (eg not like foo.bar() ). In Node, this is simply not a reference to the global namespace.


NB 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 .

Your browser code has the window host object. Node does not have that host object. When you set this.name , you are actually setting it to the window object aka making a global variable.

window.name === this.name // true

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM