2016-02-05 50 views
2

注意:这只是出于好奇,而不是我这样的拦截器。NodeJS中GLOBAL变量的秘密

当我正在处理我的NODE项目时,我遇到了一些让我困惑的事情,但我找不到为什么会这样。请找样本代码来了解这个问题

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

现在,in node documentation上面清清楚楚地写着

顶级范围不是全局范围

,所以我从上面的注释,为什么理解thisfalse以外的function a(顶级)。但后来里面function athis指向GLOABAL,为什么呢?

我使用node-5.5.0,但我检查的行为上node-0.12,其一贯

可能是它的一些愚蠢的误解,从我的身边,多包涵。

UPDATE:由的方式 - 在顶层thismodule.exports,和this在函数内部是GLOBAL

+1

你在混淆两个不同的概念。 “this”的价值与范围无关。 – Quentin

+0

@Quentin:我试图为“任何函数之外的JS代码”(如浏览器中的全局范围)找到一个名称,在这个问题中,我只是指不同范围内的上下文。编辑问题 – Oxi

+0

查看[存储在node.js中的模块变量在什么范围内?](http://stackoverflow.com/q/15406062/1048572) – Bergi

回答

1

您的问题与节点本身无关,但与ECMAScript规范本身无关。您可能想了解Lexical EnvironmentsExecution Contexts

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

The MDN给出了一些洞察:

首先,作为本传递给在严格模式的函数的值没有被强制进入作为(又名“盒装”)的对象。对于一个正常的函数,这总是一个对象:要么提供的对象,如果用一个对象赋值this来调用;如果使用布尔值,字符串或数字调用此值,则装箱;或者全局对象如果使用undefined或null调用。 (使用调用,应用或绑定来指定特定的这一点。)不仅自动装箱成为性能成本,而且暴露浏览器中的全局对象也是一种安全隐患,因为全局对象提供对“安全”JavaScript环境功能的访问必须限制。因此,对于严格模式功能,指定该未盒装到对象,并且如果未指定的,这将是未定义

所以,在非严格模式,this在函数内部将默认为global


引擎盖下,节点模块被包裹在一个函数调用,这将给你访问exportsrequiremodule__filename__dirname变量:

(function (exports, require, module, __filename, __dirname) { 
    // your actual code will be injected here 
}); 

此功能是通过运行作为背景的exports(即this)。

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的信息,本文内容非常丰富。

+1

当一个函数中* not *时,OP似乎会询问'this'。 – Bergi

+0

@Ben:那么我的问题主要是关于nodejs中的'module.exports'(不适用于浏览器),'strict mode'或'non strict mode'。无论如何,Berge提供的链接和其他一些阅读清除它。谢谢 – Oxi

+0

@Bergi我认为这是问题的症结所在“但在函数内部,这指向GLOABAL,为什么是这样的:)” –