javascript - 在 JavaScript 中,为什么不存在的“窗口”属性值在这两种情况下不同?
问题描述
我有一段 JavaScript 代码:
var o = {
name: "aaaa",
f: function () {
console.log(this);
console.log(this.name);
}
};
var m1 = o.f;
m1();
console.log(window.non_existent_property);
据我了解,属性名称应该无关紧要。如果我将name
对象的属性名称更改o
为a
任何地方,我应该得到相同的结果。然而,这种情况并非如此。见下图。我在 FireFox 75.0 上运行代码。谁能解释一下这里发生了什么?
解决方案
问题不o
在于对象中的属性 - 属性名称实际上完全不相关,因为当您将函数分配给独立变量时,您会丢失调用上下文:
var m1 = o.f;
m1();
上面的代码意味着m1
在没有调用上下文的情况下被调用,这意味着函数this
内部m1
要么是全局对象(在草率模式下),要么是undefined
(在严格模式下)。
由于您处于草率模式,因此this.name
referenceswindow.name
是一个始终存在且必须始终是字符串的保留属性。window
它默认为空字符串。
这是另一个演示相同问题的片段:
var foo = 'foo';
var o = {
f: function () {
console.log(this.foo);
}
};
var m1 = o.f;
m1();
foo
是窗口的一个属性,因为一个名为的全局变量foo
是用 声明的var
,所以this.foo
引用window.foo
.
推荐阅读
- powershell - PowerShell 列出具有超过 1 人的完全访问委托权限的 Exchange 邮箱
- c# - Visual Studio 中的 Find All References 是否足以判断一段代码是否未使用?
- angularjs - 如何在 Apache Zeppelin 中将 JSON 从 Spark 传递到 AngularJS
- vba - Excel:从单元格中删除空格
- c++ - 在 CMake 中使用 protobuf 作为 ExternalProject
- python - 用 Python 发送 Telegram 键盘
- jquery - Highcharts :: Pie :: 添加特定系列的图标
- php - Wordpress 主题崩溃,并且 wp-admin 无法正常工作 - php 问题
- android - RecyclerView 不滚动
- php - 将 php 连接到 microsoft sql 服务器