En el siguiente código, esperaría que se llamara a printHello dos veces (una desde go() y otra desde runTask() ):
class Hello { task = undefined; runTask() { console.log("Task is", this.task); this.task(); } printHello() { console.log("Hello"); } go() { this.task = this.printHello; console.log("Set task to", this.task); setTimeout(this.runTask, 0); // Fails // setTimeout(() => this.runTask(), 0); // Works } }; const hello = new Hello(); hello.go(); // Says `this.task` is undefined, but then... hello.runTask(); // ... running it manually works fineEn mi mente:
go()task en esa instancia en printHellorunTask la tarea después del tiempo de espera Esperaría que se llamara a runTask con la task establecida en printHello , pero en realidad no está undefined en la llamada setTimeout . Sin embargo, si solo llamo a runTask directamente en mi instancia de hello , funciona bien. Además, si reemplazo la llamada setTimeout con una lambda, funciona bien.
Parece claro que es un tipo de problema de cierre obsoleto, simplemente no tengo un gran modelo mental o libro de reglas que me impida escribir código como este en el futuro y luego quedarme perplejo acerca de por qué no funcionó.
Estaba pensando que this se capturaría al pasar runTask , que luego debería apuntar a una tarea válida, pero ese no es el caso.
Realmente agradecería alguna información sobre exactamente por qué esto no funciona y requiere que se use la versión lambda.