Docs Menu
Docs Home
/
MongoDB Shell
/

コードのスコープ

項目一覧

  • 例: スコープの制限

JavaScript が mongoshに読み込まれると、 constvarletで定義された最上位の関数と変数がグローバル スコープに追加されます。

次のコードを考えてみましょう。

const SNIPPET_VERSION = "4.3.2";
var loadedFlag = true;
let unloaded = false;
function isSnippetLoaded(loadedFlag) {
return ( loadedFlag ? "Snippet is loaded" : "Snippet is not loaded" )
}

変数、 SNIPPET_VERSIONloadedFlagunloadedは、関数isSnippetLoaded()とともにグローバル スコープに追加されます。

他のコードで定義された関数や変数との衝突を避けるため、スクリプトを作成する際には必ずスコープを考慮してください。 ベストプラクティスとして、MongoDB ではコードをラップして範囲を制限することをお勧めします。 これにより、グローバル スコープ内の同様の名前の要素との、誤ったスコープの衝突を防止します。

関数と変数をグローバル スコープから除外する方法の 1 つは、次のようにコードをラップすることです。

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

Tip

use strict; は スクリプトで使用されます。 mongoshコンソールにuse strict;を直接入力すると、 mongoshstrictというデータベースに切り替えられます。

次のコード サンプルと比較してください。 これらは非常によく似ていますが、2 番目の は変数のスコープを制限する方法で記述されています。

サンプル1 : 無制限スコープ。

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 ;
}

サンプル2 : 制限付きスコープ。

(() => {
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 ;
}
} )()

サンプル2では、次の要素はすべて匿名関数内にスコープ設定されており、グローバル スコープからすべて除外されています。

  • メインの関数、 yearlySales()

  • ヘルパー関数、 quarterlySales()

  • 変数

globalThis.exposedYearlySales = function yearlySales()割り当てステートメントは、グローバル スコープにexposedYearlySalesを追加します。

exposedYearlySales()を呼び出すと、 yearlySales()関数が呼び出されます。 yearlySales()関数には直接アクセスできません。

戻る

require() と load()