let role = {
test: (variable) => {
// How do I call toLog(variable) from here?
},
toLog: (variable) => {
console.log(variable);
}
};
我想在test()函数中调用toLog()函数,但我不知道如何。
答案 0 :(得分:14)
标准JS函数使用动态绑定,this
取决于谁在运行时调用方法,因此如果我们使用role.test()
调用它,它会将this
绑定到role
}。
箭头函数将this
绑定到当前上下文。例如,如果代码在浏览器的控制台中是写的,则this
绑定到window
对象。这称为静态词法绑定,这意味着将this
绑定到它所定义的闭包。
如果您不使用箭头功能,this
在role
调用时会指向对象本身:
const role = {
test(variable){
this.toLog(variable);
},
toLog(variable) {
console.log(variable);
}
};
role.test(5);
在这种情况下,我们不希望将this
绑定到外部上下文,因此我们将跳过静态绑定以支持动态绑定。
但是,如果我们将此方法用作回调,则动态绑定将根据运行该方法的人员更改this
。为防止这种情况发生,我们必须使用bind
创建与role
的显式静态绑定。
const role = {
test(variable) {
this.toLog(variable);
},
toLog(variable) {
console.log(variable);
}
};
let test = role.test;
try {
test(20); // will throw an error - this.toLog is not a function - because this points to window
} catch (e) {
console.log(e);
}
test = role.test.bind(role);
test(25); // will work because it's staticly binded to role