Docs 菜单
Docs 主页
/
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()

在此页面上