NodeJS中GLOBAL变量之谜

时间:2016-02-05 11:53:53

标签: javascript node.js

注意:这只是出于好奇,而不是我的阻挡。

当我在我的NODE项目上工作时,我遇到了一些让我感到困惑的事情,我无法找到原因。请查找示例代码以了解问题

function a() {
    console.log(this === GLOBAL);  //true
}    
console.log(this === GLOBAL);      // false
a();

现在,in node documentation明确表示

  

顶级范围不是全局范围

所以我从上面了解到为什么thisfalse(顶级)之外是function a。但是function a this内部指的是GLOABAL,为什么会这样?

我正在使用node-5.5.0,但我检查了node-0.12上的行为,一致

可能是我身边的一些愚蠢的误会,请耐心等待。

更新:顺便说一句,顶级thismodule.exports,函数内的thisGLOBAL

2 个答案:

答案 0 :(得分:1)

您的问题与Node本身无关,而与ECMAScript规范本身无关。您可能希望了解Lexical EnvironmentsExecution Contexts

this在函数调用中仅为global,因为您处于非严格模式;如果你要使用'use strict';编译指示,this将是未定义的。

The MDN提供了一些见解:

  

首先,在严格模式下传递给函数的值不会被强制成为对象(a.k.a。" boxed")。对于普通函数,它始终是一个对象:如果使用对象值this调用提供的对象;如果使用布尔值,字符串或数字调用,则为盒装值;或者使用undefined或null调用全局对象。 (使用call,apply或bind来指定特定的。)不仅自动装箱会降低性能成本,而且在浏览器中暴露全局对象也存在安全隐患,因为全局对象提供了对安全"安全& #34; JavaScript环境必须限制。因此,对于严格模式函数,指定的函数不会被装入对象中,如果未指定,则这将是未定义的

因此,在非严格模式下,函数内的this将默认为global

在幕后,Node模块包含在函数调用中,这样您就可以访问exportsrequiremodule__filename和{{1变量:

__dirname

使用(function (exports, require, module, __filename, __dirname) { // your actual code will be injected here }); 作为上下文(即exports)运行此函数。

答案 1 :(得分:0)

在JavaScript中,this的值会导致很多混乱。我将尝试解释这里相关的位:

  • 在“独立”功能中,this成为全局对象
  • 在方法中(即附加到对象的函数)this成为其方法被调用的对象

例如

function a() { console.log(this) }
a() //-> logs the global object (window in the browser, global in node)

var obj = { a: function () { console.log(this) } }
obj.a() //-> logs 'obj'

您对this设置为全局的观察结果并非对节点唯一,在浏览器中也是如此。在JavaScript中有一个称为“严格模式”的东西,它在启用时会在我们讨论的情况下产生this=undefined的值,这是一个更明智的价值。

如果您想了解有关thishttp://www.2ality.com/2014/05/this.html的更多信息,请参阅此文章。