文档菜单
文档首页
/
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 推荐使用代码包装来限制作用域。这可以防止意外与全局作用域中具有相同名称的元素发生作用域冲突。

将函数和变量从全局作用域中分离的一种方法是将代码包装如下

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

提示

use strict; 用于脚本。如果在 mongosh 控制台中直接输入 use strict;mongosh 将切换到名为 strict 的数据库。

比较以下代码示例。它们非常相似,但第二个示例以限制变量作用域的方式编写。

示例 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() 的区别