为什么节点全局上下文==='这个'只是有时候,在一个样本中?

时间:2016-03-20 02:44:27

标签: node.js this

我有以下test.js文件,它发出两行输出,每行测试全局对象和this之间的严格相等。

var c = require("console");

console.log(this === global);

(function () {
    console.log(this === global);
})();

当我使用node.exe test.js从命令行运行此文件时,我得到以下输出:

  


  真

然而,当我从节点REPL中加载test.js时,它为我提供了不同的输出:

  


  真的

这是在REPL

中加载脚本的完整记录
PS C:\Programming> node
> .load test.js
.load test.js
> var c = require("console");
undefined
> console.log(this === global);
true
undefined
>
> (function () {
...     console.log(this === global);
... })();
true
undefined
>
> .exit

同一脚本的这两种运行方案之间输出差异的原因是什么?

在任何一种情况下都不启用严格模式(默认情况下,节点命令行将strict设置为false);代码没有用'use strict';调用严格模式。

我在Windows 10 x64上使用节点5.9.0。

1 个答案:

答案 0 :(得分:2)

原因是这两种环境不同。当您在命令行或require()文件上执行文件时,它们将作为节点模块加载,这些模块在this === module.exports的特殊环境中执行(尽管您应该使用exports / {{ 1}}而不是模块中的module.exports

由于REPL的性质/目的,将REPL视为节点模块是没有意义的,因此REPL中的所有代码都只是在同一范围内执行。