Escopo do código
Nesta página
Quando o JavaScript é carregado no mongosh
, as funções e variáveis de nível superior definidas com const
, var
e let
são adicionadas ao escopo global.
Considere o seguinte 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" ) }
As variáveis SNIPPET_VERSION
, loadedFlag
e unloaded
são adicionadas ao escopo global junto com a função isSnippetLoaded()
.
Para evitar colisões com funções e variáveis definidas em outros códigos, considere o escopo ao escrever os scripts. Como prática recomendada, o MongoDB recomenda envolver seu código para limitar o escopo. Isso evita colisões acidentais do escopo com elementos nomeados de forma semelhante no escopo global.
Uma maneira de manter funções e variáveis fora do escopo global é envolver seu código da seguinte forma:
;(() => { ... })()
Dica
Exemplo: restrição do escopo
Compare as seguintes amostras de código. Eles são muito semelhantes, mas o segundo é escrito de uma forma que restringe o escopo da variável.
Amostra 1: escopo irrestrito.
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 ; }
Amostra 2: escopo restrito.
(() => { 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 ; } } )()
Na Amostra 2, os seguintes elementos têm escopo dentro de uma função anônima e são todos excluídos do escopo global:
A função principal,
yearlySales()
A função de auxiliar,
quarterlySales()
As variáveis
A declaração de atribuição globalThis.exposedYearlySales = function yearlySales()
adiciona exposedYearlySales
ao escopo global.
Quando você chama exposedYearlySales()
, ele chama a função yearlySales()
. A função yearlySales()
não é diretamente acessível.