浏览器和节点之间有什么区别?例如:
节点上的 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>
第二个日志不同,为什么?
答案 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'中关于this
的ES5 strict mode评论提示再次进行编辑:
- 在全局上下文中(在任何函数之外),
this
引用全局对象,无论是否处于严格模式。- 当
this
关键字出现在函数内部时,其值取决于how the function is called。- 当一个函数作为一个对象的方法被调用时,它的
this
被设置为调用该方法的对象。
答案 1 :(得分:2)
您的浏览器代码包含window
主机对象。节点没有该主机对象。设置this.name
时,实际上是将其设置为window
对象,即创建全局变量。
window.name === this.name // true