代码范围
在此页面上
当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 :范围不受限制。
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()
函数。