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() 之间的区别

在此页面上