Leí muchos temas (aquí y en otros lugares) sobre setTimeout y this enlace. De todos modos, hay algo que necesito entender mejor. Comienzo con el siguiente ejemplo.
let myObj = { p: 'my property', m() { console.log(this.p); } } setTimeout(myObj.m, 100); // undefined setTimeout(function() {myObj.m()}, 100); // 'my property'Lo que leí de DOC es
El código ejecutado por setTimeout() se llama desde un contexto de ejecución separado de la función desde la que se llamó a setTimeout. Se aplican las reglas habituales para establecer la palabra clave this para la función llamada, y si no ha establecido esto en la llamada o con bind, se establecerá de forma predeterminada en el objeto de ventana (o global). No será lo mismo que este valor para la función que llamó setTimeout.
Y una forma de arreglar usando el contenedor de funciones.
Una forma común de resolver el problema es usar una función contenedora que establezca esto en el valor requerido.
como hice en la última declaración del fragmento.
Mi duda: ¿por qué pasar un método por obj a setTimeout sin envolverlo no funciona? Pasar object.method debería establecer this en el objeto de todos modos. Pero tal vez la invocación directa de setTimeout lo anula, forzando a this sea window .
Pensé que tal vez el uso de una función contenedora crea un nuevo alcance subyacente que puede hacer referencia a myObj por cierre y, posteriormente, llamar a setTimeout(myObj.m(), 100) establece el derecho this .
Gracias de antemano