javascript - Node.js 和浏览器中对“this”的不同处理
问题描述
我在本地安装了 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 ?
解决方案
您能否向我解释一下,为什么 Node.js 在全局范围内看不到 x ?
如果您在 Node 控制台中运行它,它确实如此。如果您将其作为文件运行,x
则在文件的范围内,而不是全局范围内。
顺便说一句,在 Node 中,您可以使用global
显式查看全局范围,就像window
在浏览器中使用一样。因此,
console.log(global == this)
根据您是在文件中还是在控制台中运行它,会给您两个不同的答案。
另外,尝试迁移到let
和const
。这更加令人困惑,因为var
在全局范围和其他地方的行为不同。在控制台和浏览器中,您的外部var x
在全局范围内,因此它定义了一个全局变量(window.x
和global.x
)。在 Node 文件中,var x
不在全局范围内,因此它在不在全局范围内时执行通常的操作:定义局部变量x
(not this.x
、 not global.x
、 just x
)。因此,您有两个局部变量,内部变量遮蔽了外部变量,这使得外部变量无法访问。同时,this.x
从未被定义。
推荐阅读
- node.js - 同时使用“Where”和“Include”语句提取数据
- oracle - 插入 databasechangelog_export 时,Liquibase genschema 因唯一约束而失败
- c# - C# 在没有 Console.Readkey() 命令的情况下执行 Main() 方法
- html - CSS @media 做奇怪的事情
- python - itertuple循环发生错误时如何执行动作
- java - 为什么 setOnClickListener 会使我的应用程序崩溃?
- python - 根据其他列的付款数据返回活动或非活动
- react-native - React.createElement:类型无效 - 需要一个字符串(对于内置组件)或一个类/函数(对于复合组件)但得到了对象
- xml - 在 xml 操作中将函数作为参数传递
- airflow-scheduler - Airflow dag 未按照开始日期和计划间隔运行