Al crear una función con bind(), ¿también se crea un entorno léxico? Mi código funciona como se esperaba, estoy haciendo una función Parcialmente aplicada con un objeto y quiero confirmar si la referencia nunca se pierde cuando usamos curry
let literal = { nombre: 'Daniel' }; function parcial(unObjeto, numero) { console.log(unObjeto); } let vinculada = parcial.bind(null, literal); vinculada(); // {nombre: 'Daniel'} literal.nuevapropiedad = 'nuevo valor'; vinculada(); // {nombre: 'Daniel', nuevapropiedad: 'nuevo valor'}Veo que si modifico el objeto "literal" más adelante en el código, la función vinculada lee ese objeto "actualizado" .
Que yo sepa, esto tiene lógica porque bind() crea un entorno léxico que se cierra en este caso en "literal" como si lo hiciera con el primer argumento (en este caso no quiero usar el primer argumento) y nunca perderá la referencia.
Básicamente, quiero mantener la referencia a "literal" en mi función para no tener que preocuparme por devolverla cada vez que cambio "literal" .
El entorno léxico tiene que ver con el alcance . Y las palabras que se usan para describir el alcance incluyen cosas como close over , global , etc.
Sin embargo, .bind() no funciona con alcance. En su lugar, funciona con enlaces . La vinculación es un concepto ortogonal al alcance. Donde el alcance define qué variables son accesibles en qué parte del código, el enlace define en qué objetos operan los métodos.
No son el mismo concepto (aunque los lenguajes como Java confunden el problema porque en realidad no tiene un concepto real de múltiples ámbitos , sino que llama "alcance" vinculante).
Este es el alcance :
var a = 1; var b = 2; function foo (c) { var d = 3; var b = 4; a = 5; console.log(a, b, c, d); } foo(10); // logs 5, 4, 10, 3 console.log(a, b); // logs 5, 2 console.log(c, d); // throws error because c and d don't existEsto es vinculante :
var x = {} x.hello = 1; x.sayHello = function () { console.log(this.hello); } x.sayHello(); // logs 1Los argumentos de función, variables globales, variables dentro de funciones, etc. son manejados por el mecanismo de alcance que, en el caso de JavaScript, crea cierres. No tienen nada que ver con la unión.
El valor de this lo maneja el mecanismo de vinculación (herencia, .bind() , etc.) y no tiene nada que ver con el alcance.
Básicamente .bind() no afecta el entorno léxico y el entorno léxico no afecta los enlaces (aunque se podría argumentar que las funciones de flecha son un tipo de enlace léxico).