WebStorm和控制台之间的执行差异

时间:2018-06-03 19:15:24

标签: javascript console this webstorm global

在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 

造成这种差异的原因是什么?

2 个答案:

答案 0 :(得分:2)

WebStorm在nodejs中运行代码。全局上下文(this)引用模块并且是一个空对象,因此属性" name"未定义。

如果您在浏览器中运行此代码,由于遗留原因,全局上下文(在这种情况下等于窗口)和全局范围有些混杂。

这是两种不同的环境。您可以添加"使用严格"在一开始就让你的代码以更可预测的方式运行,但仍然会有一些差异。

答案 1 :(得分:2)

在浏览器中有一个window对象,脚本创建的所有变量都属于该对象,因此在浏览器中this.name“实际上”window.name,因为this }指的是函数范围中的window

现在,WebStorm运行此代码就好像它是一个NodeJS应用程序一样,这很好,因为WebStorm不需要在后台运行浏览器,只需在PATH变量中使用任何节点解释器。然而,NodeJS没有window对象,所有变量都属于该对象,因此无法找到this.namethis是指由于您不在模块内部而为空的模块。