为什么节点全局上下文 === 仅在示例中偶尔'this'?



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

var c = require("console");
console.log(this === global);
(function () {
    console.log(this === global);
})();

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


但是当我加载测试时.js从节点 REPL 内部它为我提供了不同的输出:


这是在 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

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

在这两种情况下都不会启用严格模式(节点命令行默认将严格设置为 false);代码不会使用 'use strict'; 调用严格模式。

我在 Windows 5.9.0 x10 上使用节点 64。

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

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

相关内容

最新更新