我正在用一些javascript函数模拟require功能,例如:

// We set up an object that will include all the public modules
// And then a require function which basically just accesses that public module
const modules = {};
function require(moduleName) {
    return modules[moduleName];
}
modules['math.js'] = function() {
    // hidden implementation details
    let incr = x => ++x;
    return {
        incr, 
        sum(x,y) { return x+y; }
    }
}

为什么它需要执行modules['math.js'] = (function() {...})();次,而不仅仅是上面提到的正常的未调用函数调用?

推荐答案

modules["match.js"]只是一个函数.您可能希望它成为一个对象:

modules["math.js"] = { ... };

但这样你就没有私有成员或功能可以使用了!一切都将公开.为了解决这个问题,我们创建了一个闭包:

modules["math.js"] = function () {
    let priv = 0;

    return { ... };
};

我们现在就在这里.为了让它成为一个闭包,让modules["math.js"]成为一个我们可以使用的好对象,我们立即调用这个函数:

modules["math.js"] = (function () {
    let priv = 0;

    return { ... };
})();

现在,modules["math.js"]是一个具有我们可以使用的成员和方法的对象,它有一个名为priv的私有局部范围变量,只能由模块使用.

这与ES6模块类似,在ES6模块中,导出一些绑定到标识符的值,文件中的所有其他内容都是私有的.

Javascript相关问答推荐

如何使用侧边滚动按钮具体滚动每4个格?

模块与独立组件

我可以使用CSS有效地实现最大宽度=100%和最大高度=100%,而无需父母有明确的/固定的宽度和高度,替代方法吗?

docx.js:如何在客户端使用文档修补程序

扫描qr code后出错whatter—web.js

如何使用JavaScript将文本插入空div

colored颜色 检测JS,平均图像 colored颜色 检测JS

对网格项目进行垂直排序不起作用

对路由DOM嵌套路由作出react

检索相加到点的子项

在数组中查找重叠对象并仅返回那些重叠对象

使用auth.js保护API路由的Next.JS,FETCH()不起作用

在画布中调整边上反弹框的大小失败

TinyMCE 6导致Data:Image对象通过提供的脚本过度上载

将Auth0用户对象存储在nextjs类型脚本的Reaction上下文中

为什么我看到的是回复,而不是我的文档?

我无法在Api Reaction本机上发出GET请求

如何从图表中映射一组图表-js使用REACT

ReactJS扫描线演示:多个曲面未同时更新的问题

在两个数组范围中输入日期范围