浏览器和节点有什么区别?
浏览器和节点有什么区别? 例如:
节点上的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