Cuando se carga JavaScript en mongosh, las funciones y variables de nivel superior definidas con const, var y let se añaden al ámbito global.
Considera 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 ámbito global es envolver tu código de la siguiente manera:
; (() => { ... })()
Tip
Ejemplo: Restringir el alcance
Compara las siguientes muestras de código. Son muy similares, pero el segundo está escrito de manera que restringe el alcance de la variable.
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 asistente,
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.