为什么在定义了一些从对象到变量上下文的方法后丢失了?
Why after defining some method from object to variable context lost?
请帮忙解答
我不明白为什么上下文在定义后丢失
class A {
func() {
console.log(this)
}
}
let a = new A();
let b = a.func;
b();
您可以参考this以澄清您的疑问。
如果您在对象 javascript 上调用一个函数,则将这个对象视为它的 this/context。
例如
let obj = {
key : 'value',
fun : function(){
}
}
// if called like obj.fun() --> obj is going to be this
// if called like let ffun = obj.fun; ffun(); ---> window/global object is going to be this
如果您使用 call/apply/bind 调用该方法,您需要将自定义上下文指定为这些方法的第一个参数。
//if call like obj.fun.call(someObject, p1, p2)
// Or obj.fun.apply(someObject, [p1, p2])
// Or let ffun = obj.fun.bind(someObject, [p1, p2]); ffun();
// someObject is going to be this in all these 3 cases
否则在直接调用函数的情况下,它会将 window/global 对象作为其上下文。
正如@junvar 在评论中所说,您应该将函数绑定到 this
。
例如,您可以在构造函数中创建它:
class A {
constructor(){
this.func = this.func.bind(this)
}
func() {
console.log(this)
}
}
let a = new A();
let b = a.func;
b();
请帮忙解答 我不明白为什么上下文在定义后丢失
class A {
func() {
console.log(this)
}
}
let a = new A();
let b = a.func;
b();
您可以参考this以澄清您的疑问。
如果您在对象 javascript 上调用一个函数,则将这个对象视为它的 this/context。
例如
let obj = {
key : 'value',
fun : function(){
}
}
// if called like obj.fun() --> obj is going to be this
// if called like let ffun = obj.fun; ffun(); ---> window/global object is going to be this
如果您使用 call/apply/bind 调用该方法,您需要将自定义上下文指定为这些方法的第一个参数。
//if call like obj.fun.call(someObject, p1, p2)
// Or obj.fun.apply(someObject, [p1, p2])
// Or let ffun = obj.fun.bind(someObject, [p1, p2]); ffun();
// someObject is going to be this in all these 3 cases
否则在直接调用函数的情况下,它会将 window/global 对象作为其上下文。
正如@junvar 在评论中所说,您应该将函数绑定到 this
。
例如,您可以在构造函数中创建它:
class A {
constructor(){
this.func = this.func.bind(this)
}
func() {
console.log(this)
}
}
let a = new A();
let b = a.func;
b();