NodeJS中的GLOBALvariables之谜

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

当我在做NODE项目的时候,我碰到了一些让我困惑的东西,我找不到为什么会这样。 请find示例代码来理解这个问题

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

现在, 在节点文档中清楚地表明

顶级范围不是全球范围

所以我从上面的笔记了解为什么thisfalsefunction a之外(顶级)。 但后来里面的function a this是指向GLOABAL ,为什么呢?

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

可能是它对我的一些愚蠢的误解,忍受着我。

更新:顺便说一句 – this在顶层是module.exports ,而this函数里面是GLOBAL

您的问题与节点本身无关,而与ECMAScript规范本身无关。 您可能需要阅读有关词汇环境和执行 环境 。

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

MDN提供了一些见解:

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

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


在这个引擎下,Node模块被包装在一个函数调用中,这将使您能够访问exportsrequiremodule__filename__dirnamevariables:

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

这个函数使用exports作为上下文运行(即this )。

在JavaScript中,这个值可能会导致很多混淆。 我会试着解释一下这里的相关部分:

  • 在“独立”function中, 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值就是this=undefined ,这是一个更合理的价值。

这篇文章是非常丰富的,如果你想更多地了解this : http : //www.2ality.com/2014/05/this.html 。