从 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);
在这两种情况下:
- 读取 属性 的值,产生函数引用。
- 该函数作为同一 属性 访问表达式的一部分执行。
func1
是访问器 属性 而 func2
是数据 属性 这一事实并不重要。重要的是如何使用读取 属性 所产生的值。
我在以下示例中发现了 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);
在这两种情况下:
- 读取 属性 的值,产生函数引用。
- 该函数作为同一 属性 访问表达式的一部分执行。
func1
是访问器 属性 而 func2
是数据 属性 这一事实并不重要。重要的是如何使用读取 属性 所产生的值。