【问题标题】:When to use an IIFE vs Object Literals? [closed]何时使用 IIFE 与对象文字? [关闭]
【发布时间】:2017-07-02 07:03:07
【问题描述】:

我即将开始为应用程序构建一个小型 javascript 模块。我接触过两种不同的代码组织方式:对象字面量和 IIFE。我知道在 IIFE 中,所有变量和函数都是私有的,除非另外公开,但是还有什么其他原因可以让我在对象文字上使用它吗?

我为什么要使用对象字面量:

var gojiraSays = 'Toxic Garbage Island!!!'

var app = {

  printStuff: function(){
    console.log(gojiraSays)
  }

}

...再说 IIFE 版本:

var app = (function(){
  var gojiraSays = 'Toxic Garbage Island!!!'

  var yellGojira = function(){
    console.log(gojiraSays);
  }

  return{
    yellGojira: yellGojira
  }

}());

app.yellGojira();

【问题讨论】:

  • 这取决于太多不同的事情。例如,如果您打算将您的模块与 WebPack 之类的东西一起使用,那么 IIFE 是完全多余的。
  • 编辑后,是的,包装在 IIFE 中的优点是封装(没有其他东西可以与您的 gojiraSays 混淆)。在其他上下文中有 IIFE(与对象文字不同),例如在 forwhile 循环中捕获局部变量的值,而不是变量本身用于异步回调 (here)。
  • 这是两个不同的东西。 IIFE 处理(私有)变量的封装,而对象提供结构来组合/分组属于一起的事物。 IIFE 不提供结构,对象不提供封装。你的问题就像问,最喜欢的是:函数还是变量?您将需要两者,并且可能会将它们结合起来。

标签: javascript


【解决方案1】:

模块模式

请参阅this 答案以了解使用对象字面量和显示模块模式 (RMP) 的优势。

IIFE

请参阅this 链接以获取有关使用 IIFE 进行项目结构的优势的信息。

我的建议

我更喜欢使用 RMP,因为它可以让您有效地分离关注点,同时提高可读性

【讨论】:

  • 我对这个答案感到困惑。愚蠢地命名为“显示模块模式”使用 IIFE,那么您如何将两者视为某种替代方案?
  • 这将帮助您回答您的疑问stackoverflow.com/questions/22906662/…
【解决方案2】:

你应该学习第三种更好的模块组织方式,即 ES6 模块,这使得这一切变得无关紧要。

// app.js
const gojiraSays = 'Toxic Garbage Island!!!'

export function printStuff() {
  console.log(gojiraSays)
}

// consumer.js
import {printStuff} from './app';

printStuff();

您将需要一些基础设施,例如 Babel 转译步骤,才能完成这项工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-06
    • 2020-06-03
    • 2011-12-21
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多