我有以下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。
答案 0 :(得分:2)
原因是这两种环境不同。当您在命令行或require()
文件上执行文件时,它们将作为节点模块加载,这些模块在this === module.exports
的特殊环境中执行(尽管您应该使用exports
/ {{ 1}}而不是模块中的module.exports
。
由于REPL的性质/目的,将REPL视为节点模块是没有意义的,因此REPL中的所有代码都只是在同一范围内执行。