コードのスコープ
項目一覧
JavaScript が mongosh
に読み込まれると、 const
、 var
、 let
で定義された最上位の関数と変数がグローバル スコープに追加されます。
次のコードを考えてみましょう。
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_VERSION
、 loadedFlag
、 unloaded
は、関数isSnippetLoaded()
とともにグローバル スコープに追加されます。
他のコードで定義された関数や変数との衝突を避けるため、スクリプトを作成する際には必ずスコープを考慮してください。 ベストプラクティスとして、MongoDB ではコードをラップして範囲を制限することをお勧めします。 これにより、グローバル スコープ内の同様の名前の要素との、誤ったスコープの衝突を防止します。
関数と変数をグローバル スコープから除外する方法の 1 つは、次のようにコードをラップすることです。
;(() => { ... })()
例: スコープの制限
次のコード サンプルと比較してください。 これらは非常によく似ていますが、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()
関数には直接アクセスできません。