javascript - Node.js 和浏览器对 'this' 的不同处理

标签 javascript node.js this global-scope

我在本地安装了 Node.js v8.10.0。我写了一个简单的脚本来玩“这个”:

var x = 1;

var fn = function (a) {
     var x = a;

     console.log(`local x = ${x}`);
     console.log(`global x = ${this.x}`);
}

fn(10);

当我通过 Node.js 执行脚本时,我得到以下结果:

local x = 10

global x = undefined

当我在 Chrome 中执行脚本时,我得到以下结果:

local x = 10

global x = 1

你能给我解释一下,为什么 Node.js 在全局范围内看不到 x 吗?

最佳答案

Could you please explain to me, why Node.js doesn't see x in global scope?

如果您在 Node 控制台中运行它,它确实如此。如果将其作为文件运行,x 位于文件范围,而不是全局范围。

顺便说一句,在 Node 中,您可以使用 global 来显式查看全局范围,就像您在浏览器中使用 window 一样。因此,

console.log(global == this)

将根据您是在文件中还是在控制台中运行它,给您两个不同的答案。

此外,尝试迁移到 letconst。这更加令人困惑,因为 var 在全局范围和其他地方的行为不同。在控制台和浏览器中,您的外部 var x 处于全局范围内,因此它定义了一个全局变量(window.xglobal.x ).在 Node 文件中,var x 不在全局范围内,因此它执行不在全局范围内时通常执行的操作:定义一个 local 变量 x(不是 this.x,不是 global.x,只是 x)。因此,您有两个局部变量,内部变量覆盖外部变量,这使得外部变量不可访问。同时,this.x 从未被定义。

关于javascript - Node.js 和浏览器对 'this' 的不同处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51493454/

相关文章:

Node.JS:查看进程为何仍在运行的工具?

javascript - Vue 通过 props 和 "this"回调

javascript - 示例 JS 函数中的 "this"是什么?

javascript - chrome.storage.local.get 如何设置一个值?

javascript - 在 `fetch()` 上使用流有什么优势?

javascript - Node.js 可以在 Tomcat 服务器中运行吗?

javascript - $(this)选择器问题jquery

javascript - 读取 JSON 数据并循环遍历它

javascript - promise - catch 不工作

javascript - 使用JS函数代替重复代码