当前位置: 首页 > 面试题库 >

是否有任何理由使用IIFE定义module.exports?

惠洛华
2023-03-14
问题内容

我的团队没有经验丰富的JS开发人员,但是我们正在Node中编写一个库,并得到了一位真正的JS开发人员的建议:“我们应该使js更具模块化-
不会污染全局名称空间并使之更具可读性。给新来者”,并告诉我们执行以下操作:

module.exports = (function(){
      return {
         nameToExpose: functionToExpose
         ...
    };
})();

而不是

module.exports.nameToExpose = functionToExpose;

这有什么意义(如果有)?后者不会进行IIFE范围内的任何本地声明,即使这样,它们对于模块文件也是本地的,而不是整个文件的全局程序require()

尽管我已经阅读了许多关于IIFE的其他解释(并在上面的评论中进行了总结),但在该网站上进行一些谷歌搜索和拨弄并没有对这个特定问题给出任何答案。一些测试当然表明,尽管后者的原始名称记录在函数类型本身中,但后者实际上
并未 放入functionToExpose全局名称空间中。


问题答案:

几乎没有区别。Node.js的整个思想(使用require,具有模块等)专门用于分离关注点。我会(谨慎地)说,如果您做对了,就不必担心会“污染”任何种类的全球范围。内的任何module.exports生活中模块中。

当您处理前端的东西时,那就是全局范围成为一个问题,因为如果一个函数或任何没有范围的东西(例如,在IIFE或其他功能块中),它就可以访问全局window对象,其他所有东西都可以访问该功能。

一个真正的JS开发人员

称某人为危险信号。

不要污染全局名称空间并使新用户更容易理解

如果您正确地对代码进行了模块化,则不必担心。IIFE有时间和地点,但是我认为没有理由将所有内容包装在 已经位于模块内部
的IIFE中,以某种方式神奇地使代码“更具模块化”或对“新手”更具可读性,而不是像设计那样简单地使用Node.js:

module.exports = function() { ... } // whatever

即使这样做,它们对于模块文件也是本地的,而不是整个文件所在的全局文件require()

你是对的。无论他怎么说,我都会撒一粒盐。也许他知道过去他的方法对他有帮助的一些特定用例,所以我会特别询问他以了解他的意见。除此之外,我觉得你在正确的轨道上。



 类似资料:
  • 问题内容: 我在ui-router中使用Typescript。有没有人为此找到任何打字稿定义。我看了确定的打字,什么也看不见。这是我要查找的接口文件: 问题答案: 我们将此 d.ts 用于: 更新的链接,2015年5月 https://github.com/borisyankov/DefinitelyTyped/blob/master/angular-ui- router/angular-ui-

  • 问题内容: 我一直在设置元类,如下所示: 但是我只是遇到了这样定义的元类: 有什么理由比另一个更喜欢吗? 更新 :请记住,我在询问有关在类中使用和的问题。我已经在另一堂课中了解了它们之间的区别。但是在元类中,我不能用来实现缓存,因为仅在元类中创建类时才调用它。 问题答案: 如果要在创建类之前更改属性dict或更改基元组,则必须使用。当看到参数时,该类对象已经存在。另外,如果要返回除所讨论类型的新创

  • 我正在用雅加达EE和雅加达Faces(JSF)进行实验。我刚刚制作了一个名为session-scoped bean的CDI(因为JSF managedBean现在已被弃用),我想知道,当作用域bean(在CDI容器中运行)可用时,为什么要使用有状态EJB,在我看来,任何事务都可以使用注入到CDI管理bean中的无状态bean来完成。 :),任何现实世界的用例都会非常有用。 对于那些想知道的人,我的

  • 问题内容: 似乎抽象类意味着该类的定义不完整,因此无法实例化。 我看到了一些简单的Java代码,其中包含一个抽象类,其中定义了所有方法。然后我想知道,为什么他们将其作为抽象类而不是真实类?他们是在这样做,所以我们不能从这个抽象类实例化吗?还是从定义了所有内容的抽象类中获得其他好处? 问题答案: 即使所有方法都具有默认实现,也有可能这些实现在应用程序上下文中实际上没有 意义 。这些方法可能仅进行内部

  • 问题内容: Java是否对重载方法使用早期绑定有任何特定的原因?不可能使用后期绑定吗? 例: 打印:对象对象 我更希望:整数对象 问题答案: 在我看来,最明显的原因是它允许编译器保证实际上会有一个要调用的函数。 假设Java根据运行时类型选择了函数,并且您这样编写: 输出是什么?对foo的第一个调用可能显示“ String”,但是第二个调用无处可去。我想它可能会生成运行时错误。这类似于严格类型与宽

  • 我使用的是Laravel 5.4。我有一个自定义表单请求类,其中有我的验证规则和消息,我在控制器中使用它,如下所示: 我正在使用ajax发送请求,当出现任何验证错误时,Laravel会抛出一个带有422状态码的HTTP响应错误,其中包括验证错误的JSON表示。 但我不想那样。相反,在我的控制器的方法中,我想找出是否有任何验证错误,如果有,那么我想返回一个带有一些额外数据的响应以及验证消息,如下所示