Cuando se carga JavaScript en mongosh, las funciones y variables de nivel superior definidas const con, var y let se agregan al ámbito global.
Considere el siguiente código:
const SNIPPET_VERSION = "4.3.2"; var loadedFlag = true; let unloaded = false; function isSnippetLoaded(loadedFlag) { return ( loadedFlag ? "Snippet is loaded" : "Snippet is not loaded" ) }
Las variables SNIPPET_VERSION, loadedFlag y unloaded se agregan al ámbito global junto con la función isSnippetLoaded().
Para evitar colisiones con funciones y variables definidas en otro código, asegúrate de considerar el alcance al escribir los scripts. Como mejores prácticas, MongoDB recomienda encerrar tu código para limitar el alcance. Esto protege contra colisiones accidentales de alcance con elementos de nombre similar en el ámbito global.
Una forma de mantener las funciones y variables fuera del alcance global es encapsular el código de esta manera:
; (() => { ... })()
Tip
Ejemplo: Restricción del alcance
Compare los siguientes ejemplos de código. Son muy similares, pero el segundo está escrito de forma que restringe el alcance de las variables.
Muestra 1: Alcance sin restricciones.
let averageGrossSales = [ 10000, 15000, 9000, 22000 ]; const Q1_DISCOUNT = .10; const Q2_DISCOUNT = .15; const Q3_DISCOUNT = .06; const Q4_DISCOUNT = .23; function quarterlySales(grossAmount, discount ) { return grossAmount * discount ; } function yearlySales() { let annualTotal = 0; annualTotal += quarterlySales(averageGrossSales[0], Q1_DISCOUNT ); annualTotal += quarterlySales(averageGrossSales[1], Q2_DISCOUNT ); annualTotal += quarterlySales(averageGrossSales[2], Q3_DISCOUNT ); annualTotal += quarterlySales(averageGrossSales[3], Q4_DISCOUNT ); return annualTotal ; }
Muestra 2: Ámbito restringido.
(() => { let averageGrossSales = [ 10000, 15000, 9000, 22000 ]; const Q1_DISCOUNT = .10; const Q2_DISCOUNT = .15; const Q3_DISCOUNT = .06; const Q4_DISCOUNT = .23; function quarterlySales(grossAmount, discount ) { return grossAmount * discount ; } globalThis.exposedYearlySales = function yearlySales() { let annualTotal = 0; annualTotal += quarterlySales(averageGrossSales[0], Q1_DISCOUNT ); annualTotal += quarterlySales(averageGrossSales[1], Q2_DISCOUNT ); annualTotal += quarterlySales(averageGrossSales[2], Q3_DISCOUNT ); annualTotal += quarterlySales(averageGrossSales[3], Q4_DISCOUNT ); return annualTotal ; } } )()
En la muestra 2, los siguientes elementos están todos definidos dentro de una función anónima y todos están excluidos del alcance global:
La función principal,
yearlySales()La función auxiliar,
quarterlySales()Las variables
La declaración de asignación globalThis.exposedYearlySales = function yearlySales() agrega exposedYearlySales al ámbito global.
Cuando tú, llamas exposedYearlySales() llama a la función yearlySales(). La función yearlySales() no es accesible directamente.