注意:这只是出于好奇,而不是我的阻挡。
当我在我的NODE项目上工作时,我遇到了一些让我感到困惑的事情,我无法找到原因。请查找示例代码以了解问题
function a() {
console.log(this === GLOBAL); //true
}
console.log(this === GLOBAL); // false
a();
现在,in node documentation明确表示
顶级范围不是全局范围
所以我从上面了解到为什么this
在false
(顶级)之外是function a
。但是function a
this
内部指的是GLOABAL
,为什么会这样?
我正在使用node-5.5.0
,但我检查了node-0.12
上的行为,一致
更新:顺便说一句,顶级this
为module.exports
,函数内的this
为GLOBAL
答案 0 :(得分:1)
您的问题与Node本身无关,而与ECMAScript规范本身无关。您可能希望了解Lexical Environments和Execution Contexts。
this
在函数调用中仅为global
,因为您处于非严格模式;如果你要使用'use strict';
编译指示,this
将是未定义的。
The MDN提供了一些见解:
首先,在严格模式下传递给函数的值不会被强制成为对象(a.k.a。" boxed")。对于普通函数,它始终是一个对象:如果使用对象值this调用提供的对象;如果使用布尔值,字符串或数字调用,则为盒装值;或者使用undefined或null调用全局对象。 (使用call,apply或bind来指定特定的。)不仅自动装箱会降低性能成本,而且在浏览器中暴露全局对象也存在安全隐患,因为全局对象提供了对安全"安全& #34; JavaScript环境必须限制。因此,对于严格模式函数,指定的函数不会被装入对象中,如果未指定,则这将是未定义的
因此,在非严格模式下,函数内的this
将默认为global
。
在幕后,Node模块包含在函数调用中,这样您就可以访问exports
,require
,module
,__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
的值,这是一个更明智的价值。
如果您想了解有关this
:http://www.2ality.com/2014/05/this.html的更多信息,请参阅此文章。