Me dieron este fragmento para depurar en una de mis entrevistas.
var module = (function sumModule(){ var a = 0; var b = 0; const init = (a,b) =>{ a = a; b = b; } function sum() { return a+b; } return { sum: sum, init } })(); module.init(1,2); console.log(module.sum()) El valor que se devuelve es 0 (0+0), la asignación de a y b en func init no sobrescribió la var a global y la var b . ¿Por qué es esto así, alguien puede explicar por favor?
NOTA: Me dijeron que lo arreglara sin cambiar el nombre de los parámetros de función (a,b) .
En lugar de cambiar el nombre de los parámetros, también puede hacer referencia a las variables globales a través de su espacio de nombres como lo hace con la función init .
*O simplemente cambie el nombre de las variables globales, si eso está permitido
var module = (function sumModule(){ var a = 0; var b = 0; const init = (a, b) => { module.a = a; module.b = b; } function sum() { return module.a + module.b; } return { sum: sum, init, } })(); module.init(1, 2); console.log(module.sum())Porque a y b en las asignaciones de la función init() se refieren a sus parámetros, no a los a y b externos. Entonces, esas asignaciones no afectan los valores de a y b externos.
Respuesta modificada de @reyno. Su ejemplo simplemente parchea a & b en el objeto del module después de la llamada .init . Por lo tanto, estas variables son públicas y ya no son privadas.
Con esto obtienes el mismo resultado, pero manteniendo las variables a & b privadas.
Para lograr esto, use un objeto de espacio de nombres privado, como hice con private .
var module = (function sumModule(){ var private = { a: 0, b: 0 } const init = (a, b) => { private.a = a; private.b = b; } function sum() { return private.a + private.b; } return { sum: sum, init, } })(); console.log(module) // no a or b property module.init(1, 2); console.log(module.sum()) console.log(module) // still no a or b property