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

时间:2020-01-19 12:36:00

标签: javascript getter-setter

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

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


x.func1(x)

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

此示例向我们展示了差异

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

x.func2()(x);

在两个示例中,作为吸气功能的 func1 和作为对象方法的 func2 均从对象 x 执行,然后执行返回的函数。那么为什么第一个示例中的 this 值不等于全局对象而不是对象 x

1 个答案:

答案 0 :(得分:13)

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

这是因为在属性访问结果后立即调用了该函数。因此,这些从根本上是等效的:

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是数据属性的事实并不重要。重要的是使用读取属性产生的值。

相关问题