从 getter 返回的函数的 `this` 关键字的值

The value of `this` keyword of a function returned from a getter

我在以下示例中发现了 this 关键字的意外值:

let x = {
    z : 10 ,
    get func1() {
        return function(v) {
            console.log(this === v);
        }
    }
}


x.func1(x)

this 关键字的值是对象 x 就好像它是从那个对象执行的一样,我希望只有 get 函数 具有 this 关键字等于调用对象 x

这个例子向我们展示了不同之处

let x = {
    func2() {
        return function(v) {
            console.log(this === v);
        }
    }
}

x.func2()(x);

在两个示例中,func1 是 getter 函数,func2 是对象的方法,它们是从对象 x 执行,然后执行返回的函数。那么为什么第一个例子中的 this 值不等于全局对象而不是对象 x

这是一个非常有趣的问题。

这是因为根据 属性 访问的结果立即调用该函数。所以这些基本上是等价的:

let x = {
    get func1() {
        return function(v) {
            console.log(this === v);
        };
    },
    func2(v) {
        console.log(this === v);
    }
};

x.func1(x);
x.func2(x);

在这两种情况下:

  1. 读取 属性 的值,产生函数引用。
  2. 该函数作为同一 属性 访问表达式的一部分执行。

func1 是访问器 属性 而 func2 是数据 属性 这一事实并不重要。重要的是如何使用读取 属性 所产生的值。