为什么在节点env和chrome控制台之间运行相同的代码是不同的?

时间:2017-11-02 17:03:48

标签: javascript node.js google-chrome scope

var name = "Global";

function funcA() {
    var name = "FunA";
    return function() {
        console.log(this.name);
    }
}

funcA()();

我使用节点在终端上运行上面的代码并返回undefined 但在Chrome控制台中,它将返回Global

为什么会这样?

2 个答案:

答案 0 :(得分:2)

1。在浏览器环境中运行此脚本会强制该顶级var成为全局window对象的属性。然后按MDN

  

由于以下代码未处于严格模式,并且由于调用未设置此值,因此默认为全局对象,即浏览器中的窗口。

因此,在该函数内调用console.log(this.name);意味着this将成为全局window对象的链接,该对象具有name属性。 window.name的值是“全局”。

2。 NodeJS没有window个对象,但它有global个对象。在NodeJS环境中运行脚本会在两种情况下中断: (a)作为模块运行(例如,通过node test.js),(b)作为模块运行(例如直接在节点控制台中运行)。 第二种情况(b)与浏览器的工作方式相同:global将获得name属性,this将是global的链接, 所以this.name的值等于global.name并且将是“全局”。

但第一个案例(a)NodeJS doc不同:

  

Object全局命名空间对象。

     

在浏览器中,顶级范围是全局范围。这意味着在浏览器中var将定义一个新的全局变量。   在Node.js中,这是不同的。顶级范围不是全球范围; Node.js模块中的var内容将是该模块的本地内容。

因此,顶级var只是Node环境中的局部变量,并且由于global没有name属性, 致电console.log(this.name)会显示undefined

答案 1 :(得分:0)

顶级作用域中的

var定义Global object中的变量。

匿名函数调用中的

this在浏览器或交互式节点会话时指向Global object,但在脚本作为节点模块运行时指向exports-object

直到严格模式......