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

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

节点上的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> 

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

节点是一个JavaScript引擎,而不是浏览器。 在Node中看到undefined的具体原因,在浏览器中看到Lulu ? 全局命名空间的差异 :

在浏览器中,顶级范围是全局范围。 这意味着在浏览器中,如果你在全局范围内, var something将会定义一个全局variables。 在Node中,这是不同的。 顶级范围不是全球范围; 在Node模块内的var something将是该模块的本地内容。

在浏览器中, this是对window对象(浏览器的全局名称空间)的引用,用于所有被独立调用的函数(例如,不像foo.bar() )。 在Node中, this根本不是对全局名称空间的引用。


NB节点解释器中的console.log(this.name)将打印Lulu ,而不是undefined 。 那是因为在REPL中,

 > this === global true 

进一步阅读@ 如何节点:这是什么?


好的,还有一个编辑按照@ŠimeVidas对ES5严​​格模式 的评论:

  • 在全局范围内(任何函数之外), this是指全局对象,无论是否在严格模式下。
  • this关键字出现在一个函数内时,它的值取决于函数的调用方式 。
  • 当一个函数被调用作为一个对象的方法时,它被设置为该方法被调用的对象。

Juriy Zaytsev(又名@ kangax)在他的一篇博客文章中提供了更有趣的阅读。

您的浏览器代码具有window主机对象。 节点没有该主机对象。 当你设置this.name ,你实际上将它设置为window对象,也就是制作一个全局variables。

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