我有一个包含多个方法和属性的类。其中一种方法有一个嵌入在其中的setTimeout()函数:
function myClass() {
this.some_property = "test";
this.PrintOnTimeout = function() {
// I can do var.self = this;
// but I can't help but feel like that would be inefficient
setTimeout(function timeoutPrint() {
// I want to reference this.some_property here.
// Currently this.some_property returns an error as
// this refers to PrintOnTimeout() rather than myClass().
});
}
}
如果在StackOverflow上有答案,请提前道歉。我环顾四周,但几乎所有我发现的关于扩展类和super()的讨论。也许super()就是这里的答案,我不理解它?我使用全局,但我更倾向于将此类的每个实例视为可能未识别的。所以,如果有这个.GetMainParent或者什么......否则,我很欣赏升级。
编辑1:目标不是通过'这个' in,这是显而易见的,而是从一组嵌套函数内的任何地方引用主块(或任何特定块,如果你设置它)。
编辑2:箭头功能是我需要的解决方案,如ASDFGerte所示。
答案 0 :(得分:1)
您可以使用arrow function绑定它,使用bind(this)或关闭存储属性的本地变量。
请注意,除非将它绑定到所涉及的每个函数,否则您需要确保始终在正确的上下文中调用所有相关函数,否则您将嵌套函数绑定到错误的:
function a(){
this.x = "hi";
this.y = function() {
setTimeout(() => { console.log(this.x); }, 100);
};
}
let obj = new a();
let outside = obj.y;
obj.y(); //y is being called with this === obj
outside(); //y is being called with this depending on strict mode, window or undefined.