浏览器和节点之间有什么区别?

时间:2011-12-24 13:45:36

标签: javascript browser node.js

浏览器和节点之间有什么区别?例如:

节点上的

setName.js

var setName;
setName = function (name) {
    return this.name = name;
};
setName("LuLu");
//LuLu
console.log(name);
//undefined
console.log(this.name);
浏览器中的

setName.html

<script>
    var setName;
    setName = function (name) {
        return this.name = name;
    };
    setName("LuLu");
    //LuLu
    console.log(name);
    //LuLu
    console.log(this.name);
</script>

第二个日志不同,为什么?

2 个答案:

答案 0 :(得分:8)

Node是JavaScript引擎,而不是浏览器。您在Node中看到undefined,在浏览器中看到Lulu的具体原因是什么? Differences in the global namespace

  

在浏览器中,顶级范围是全局范围。这意味着在浏览器中如果您处于全局范围var something将定义全局变量。在Node中,这是不同的。顶级范围不是全球范围; Node模块中的var something将是该模块的本地。

在浏览器中,this是对window对象(浏览器的全局命名空间)的引用,用于所有未附加到对象的函数(例如 not like foo.bar())。在Node中,this根本不是对全局命名空间的引用。


节点解释器中的

N.B。 console.log(this.name)将打印Lulu,而不是undefined。那是因为,仅在REPL中

> this === global
true

进一步阅读@ How To Node: What is "this?"


好的,@Šime Vidas'中关于thisES5 strict mode评论提示再次进行编辑:

  
      
  • 在全局上下文中(在任何函数之外),this引用全局对象,无论是否处于严格模式。
  •   
  • this关键字出现在函数内部时,其值取决于how the function is called
  •   
  • 当一个函数作为一个对象的方法被调用时,它的this被设置为调用该方法的对象。
  •   

Juriy Zaytsev (aka @kangax)one of his blog posts提供更有趣的阅读。

答案 1 :(得分:2)

您的浏览器代码包含window主机对象。节点没有该主机对象。设置this.name时,实际上是将其设置为window对象,即创建全局变量。

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