我有一段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上运行代码。有人可以解释一下这里发生了什么吗?
问题与object中o
的属性无关-属性名称实际上是完全无关,因为将函数分配给独立对象时会丢失调用上下文变量:
var m1 = o.f;
m1();
上面的代码表示在没有调用上下文的情况下调用了m1
,这意味着this
函数内部的m1
将成为全局对象(在草率模式下)或undefined
(在严格模式下) 。
由于处于草率模式,所以this.name
引用window.name
,它是reserved property,始终存在于window
上,并且必须始终为字符串。它默认为空字符串。