¿Cuál es la diferencia entre una variable:
const a = console.log; a('HELLO');
y una función de flecha:
const a = (str) => console.log(str); a('HELLO');
Y por qué en caso de usar un miembro de la clase no funciona
class MyClass { foo; str; constructor(str, foo) { this.str = str; this.foo = foo; } getFoo() { return this.foo(this.str); } } const instance = new MyClass(123, console.log); // works const f = (str) => { instance.getFoo(str); } f('Hello'); // doesn't works -> this.str is undefined const f = instance.getFoo; f('Hello');
variable = classInstance.function
en realidad solo devuelve una referencia a la función en el prototipo, no vinculada a la instancia real, this.*
busca variables globales.
Si desea poder tener otra variable que almacene la función con el contexto de esa variable, debe usar .bind(...)
o similar
También puedes darle un contexto personalizado.
class MyClass { foo; str; constructor(str, foo) { this.str = str; this.foo = foo; } getFoo() { return this.foo(this.str); } } const instance = new MyClass(123, console.log); // give it the context object const f = instance.getFoo.bind(instance); f('Hello'); const f2 = instance.getFoo.bind({ str: "abcd", foo: console.log}); f2("..."); // Equal to the prototype console.log(instance.getFoo == MyClass.prototype.getFoo);