Así que creo que simplemente no es posible, pero me pregunto... ¿hay alguna manera de crear una función que funcione así?
const someFunction=()=> console.log(a); //printing some ref that is not out of this scope; const wrappedFn = wrapFnOnScope(someFunction,{a:"Hello World!"}); wrappedFn() // prints Hello World!Esto es de hecho imposible. JavaScript tiene alcance léxico, lo que significa que el alcance de las variables en su cierre depende (solo) de dónde definió la función. No es posible cambiar esto después.
Si desea un enlace tardío, debe usar parámetros en JavaScript. Puede ser
const someFunction = (obj) => console.log(obj.a); someFunction({a: 'Hello World'}); // or const wrappedFunction = () => someFunction({a: 'Hello World'}); const wrappedFunction = someFunction.bind(undefined, {a: 'Hello World'}); o usando el parámetro cero implícito this :
function someFunction() { console.log(this.a); } someFunction.call({a: 'Hello World'}); // or const wrappedFunction = () => someFunction.call({a: 'Hello World'}); const wrappedFunction = someFunction.bind({a: 'Hello World'}); Si insiste en referirse a a variable en someFunction , use la desestructuración
const someFunction = ({a}) => console.log(a); function someFunction() { const {a} = this; console.log(a); } o incluso la temida declaración with (¡mala idea!), pero finalmente debes hacer esto dentro de someFunction . No hay envoltura mágica wrapFnOnScope .
Parece que estás combinando variables y propiedades . Una variable es un nombre temporal dado a un valor en el código. Una propiedad es un par clave-valor almacenado dentro de un objeto.
Si desea crear una función que simplemente extraiga una determinada propiedad de un objeto, puede hacerlo así:
const bird = { wings: 2, color: "red" }; const getColor = value => value.color; const birdColor = getColor(bird); // "red"En segundo lugar, está intentando asignar argumentos por adelantado a una función, pero solo para ejecutar dicha función más tarde. Esto se puede hacer envolviendo la llamada de función en una función sin argumentos como este:
const a = 1; const b = 2; const c = 3; const delayedApplication = () => console.log(a + b + c); // nothing happened yet delayedApplication(); // "6" has been logged to the console