首页 > 解决方案 > 在 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对象的属性名称更改oa任何地方,我应该得到相同的结果。然而,这种情况并非如此。见下图。我在 FireFox 75.0 上运行代码。谁能解释一下这里发生了什么?

标签: javascriptpropertiesglobal

解决方案


问题不o在于对象中的属性 - 属性名称实际上完全不相关,因为当您将函数分配给独立变量时,您会丢失调用上下文:

var m1 = o.f;
m1();

上面的代码意味着m1在没有调用上下文的情况下被调用,这意味着函数this内部m1要么是全局对象(在草率模式下),要么是undefined(在严格模式下)。

由于您处于草率模式,因此this.namereferenceswindow.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.


推荐阅读