代码作用域
本页内容
当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()
函数不能直接访问。