javascript - 这个关键字在 NodeJS 和 Vanila JavaScript 之间的作用不同
问题描述
我正在尝试了解 JavaScript 词法范围和闭包。我使用 Node.js 运行了这个示例,然后在浏览器中得到了 2 个不同的输出。
测试chrome Version 80.0.3987.149 (Official Build) (64-bit)
和Node v12.16.1
var obj1 = {
name: "Pulsar",
bike: function() {
console.log(this.name);
}
}
var obj2 = { name: "Gixxer", bike: obj1.bike };
var name = "Ninja";
var bike = obj1.bike;
bike(); // "Ninja"
obj1.bike(); // "Pulsar"
obj2.bike(); // "Gixxer"
这段代码在Vanilla JavaScript
. 输出是:
Ninja
Pulser
Gixxer
在NodeJS
输出中是:
undefined
Pulsar
Gixxer
有人可以解释一下吗?
解决方案
在浏览器中,顶级范围是全局范围。这意味着当你用它定义某些东西时,var
它就变成了全局对象的一个属性,即window
.
所以bike
andname
都定义在全局范围内,这意味着它们都是window
属性,所以this
指向window
并且它有一个name
属性,值为Ninja
。
在node中,全局范围内的任何var都定义在不同的本地模块中,因此this
与变量bike
无关name
推荐阅读
- python-3.x - 使用 Google Directory API 创建 gmail 组的权限不足
- java - android.view.InflateException: Binary XML file line #11: Error inflating class EditText in android
- tensorflow - How can I modify ModelCheckPoint in keras to monitor both val_acc and val_loss and save accordingly the best model?
- recursion - (M68k) 为什么我的值没有传递到 D0?
- javascript - 点击计算数字
- kubernetes - 运行“top”时,linkerd cli 返回“无效参数”
- amazon-web-services - AWS Lambda 控制台 - 升级 boto3 版本
- profiling - 如何在 Pytroch 中逐层分析?
- ldap - ldapsearch 没有条目错误 32(openldap)
- google-cloud-platform - 如何增加 COMMITTED_CPUS 配额?