[英]what's the difference between Browsers and Node?
浏览器和节点之间有什么区别? 例如:
节点上的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>
第二个日志不同,为什么?
Node是JavaScript引擎,而不是浏览器。 您在Node中看到undefined
的特定原因,以及浏览器中的Lulu
? 全局命名空间的差异 :
在浏览器中,顶级范围是全局范围。 这意味着在浏览器中,如果您在全局范围内,
var something
会定义一个全局变量。 在Node中,这是不同的。 顶级范围不是全球范围; Node模块内的var something
将是该模块的本地内容。
在浏览器中, this
是对一个参考window
对象-浏览器的全局命名空间-对于其上调用独立的对象的所有功能(例如, 不喜欢foo.bar()
在Node中, this
不是对全局命名空间的引用。
节点解释器中的NB console.log(this.name)
将打印Lulu
,而不是undefined
。 那是因为, 仅在REPL中,
> this === global
true
进一步阅读@ 如何节点:什么是“这个?”
好了,按照提示通过一个多编辑@ SIME维达斯关于评论this
在ES5严格模式 :
- 在全局上下文中(在任何函数之外),
this
指的是全局对象,无论是否处于严格模式。- 当
this
关键字出现在函数内部时,其值取决于函数的调用方式 。- 当一个函数被调用作为对象的方法,其
this
被设置为方法被调用的对象。
更有趣的阅读由Juriy Zaytsev(又名@kangax)在他的一篇博客文章中提供 。
您的浏览器代码具有window
主机对象。 节点没有该主机对象。 设置this.name
,实际上是将其设置为window
对象,即创建全局变量。
window.name === this.name // true
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.