Menu Docs

Página inicial do DocsVisualizar & analisar dadosMongoDB Shell

Escopo do código

Nesta página

  • Exemplo: restrição de escopo

Quando o JavaScript é carregado no mongosh, as funções de nível superior e variáveis 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 outro código, certifique-se de considerar o escopo ao escrever scripts. Como prática recomendada, o MongoDB recomenda encapsular seu código para limitar o escopo. Isso protege contra colisões acidentais de escopo com elementos nomeados de forma semelhante no escopo global.

Uma maneira de manter funções e variáveis fora do escopo global é encapsular seu código da seguinte maneira:

'use strict';
(() => {
...
})()

Dica

use strict; é para uso em scripts. Se você inserir use strict; diretamente no console do mongosh , o mongosh mudará para um reconhecimento de data center chamado strict.

Compare as seguintes amostras de código. Elas 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 está diretamente acessível.

← Diferenças entre require() e load()