在WebStorm中运行此代码时
function sayNameForAll() {
console.log(this.name);
}
var person1 = {
name: "Nick",
sayName: sayNameForAll
};
var person2 = {
name: "Greg",
sayName: sayNameForAll
};
var name = "michael";
person1.sayName();
person2.sayName();
sayNameForAll();
打印出以下内容
Nick
Greg
undefined
但在控制台中运行时会打印出
Nick
Greg
Michael
造成这种差异的原因是什么?
答案 0 :(得分:2)
WebStorm在nodejs中运行代码。全局上下文(this)引用模块并且是一个空对象,因此属性" name"未定义。
如果您在浏览器中运行此代码,由于遗留原因,全局上下文(在这种情况下等于窗口)和全局范围有些混杂。
这是两种不同的环境。您可以添加"使用严格"在一开始就让你的代码以更可预测的方式运行,但仍然会有一些差异。
答案 1 :(得分:2)
在浏览器中有一个window
对象,脚本创建的所有变量都属于该对象,因此在浏览器中this.name
“实际上”window.name
,因为this
}指的是函数范围中的window
。
现在,WebStorm运行此代码就好像它是一个NodeJS应用程序一样,这很好,因为WebStorm不需要在后台运行浏览器,只需在PATH
变量中使用任何节点解释器。然而,NodeJS没有window
对象,所有变量都属于该对象,因此无法找到this.name
。 this
是指由于您不在模块内部而为空的模块。