node.js - 为什么示例中 Node 全局上下文 === 'this' 仅有时出现?

标签 node.js this

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

var c = require("console");

console.log(this === global);

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

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

false
true

但是,当我从 Node REPL 内部加载 test.js 时,它会提供不同的输出:

true
true

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

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

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

我在 Windows 10 x64 上使用 Node 5.9.0。

最佳答案

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

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

关于node.js - 为什么示例中 Node 全局上下文 === 'this' 仅有时出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36109701/

相关文章:

javascript - jQuery 强制在 Backbone View 中保留 "this"的引用

java - 定义与父类(super class)构造函数中的另一个常量相关的常量

c++ - 在类中使用相同的变量可以在构造函数 C++ 中使用吗?

node.js - 在 Node.js 中记录每个请求

node.js - 使用 asyncjs 保存多个 Mongoose 对象不起作用

javascript - 通用函数中的特定变量名称 - Node.js

javascript - 对象函数属性中的 React 类 : Referencing class as "this",

Java 使用新类向现有类添加功能,同时仍然公开先前类的所有方法

javascript - 如何在node.js中指定模块路径

node.js - nodejs从url下载并解压文件,错误No END header found