Javascript WebStorm和console之间的执行差异

Javascript WebStorm和console之间的执行差异,javascript,console,this,webstorm,global,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.sayNam

在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 

是什么导致了这种差异?

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

如果在浏览器中运行此代码,由于遗留原因,全局上下文(在本例中等于窗口)和全局范围会有点混合


这是两种不同的环境。您可以在开始时添加“use strict”以使代码以更可预测的方式运行,但仍然会有一些差异。

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

如果在浏览器中运行此代码,由于遗留原因,全局上下文(在本例中等于窗口)和全局范围会有点混合


这是两种不同的环境。您可以在开始时添加“use strict”以使您的代码以更可预测的方式运行,但仍然会有一些差异。

在浏览器中有一个
窗口
对象,脚本创建的所有变量都是该对象的属性,因此在浏览器中
this.name
是“实际”的
window.name
因为
这个
指的是功能范围中的
窗口


现在WebStorm像运行NodeJS应用程序一样运行这段代码,这非常好,因为WebStorm不需要在后台运行浏览器,只需在
路径
变量中使用任何节点解释器即可。但是NodeJS没有所有变量都是其属性的
窗口
对象,因此它找不到
这个.name
指的是空模块,因为您不在模块内。

在浏览器中有一个
窗口
对象,脚本创建的所有变量都是该对象的属性,因此在浏览器中
此名称
为“实际”
window.name
因为
这个
指的是功能范围中的
窗口

现在WebStorm像运行NodeJS应用程序一样运行这段代码,这非常好,因为WebStorm不需要在后台运行浏览器,只需在
路径
变量中使用任何节点解释器即可。但是NodeJS没有所有变量都是其属性的
窗口
对象,因此它找不到
这个.name
<代码>此
指的是空模块,因为您不在模块内