javascript - 模块模式是否需要使用 IIFE?

标签 javascript iife

在 Udacity 类(class)中,它提到了关于模块模式的相互矛盾的事情:

The Module Pattern requires the use of IIFE's

At its core, the Module Pattern leverages scope, closures, and (commonly) IIFE's.

所以,如果我理解正确的话,模块模式需要使用闭包,但是闭包是否需要位于 IIFE 中?

最佳答案

在 JavaScript ECMAScript 5 及更早版本中,an IIFE, or immediately-invoked function expression ,对于创建一个阻止 var 的函数作用域是必要的实现揭示模块模式时避免污染全局命名空间的声明。

(function () {
  var foo = 'bar'
  var counter = 0

  this.someGlobalModule = function () {
    counter++

    return { foo: foo, counter: counter }
  }
}.call(this))
// this === window at top-level in browser

// no access to function-scope foo or counter, only someGlobalModule()
var value = someGlobalModule()

// value.foo === 'bar'
// value.counter === 1

现在,JavaScript ECMAScript 6 引入了 constlet声明允许 block 作用域变量,而不是函数作用域,因此您可以简单地使用 block-scope实现揭示模块模式:

{
  const foo = 'bar'
  let counter = 0

  // this === window at top-level in browser
  this.someGlobalModule = () => {
    counter++

    return { foo, counter }
  }
}

// no access to block-scope foo or counter, only someGlobalModule()
let value = someGlobalModule()

// value.foo === 'bar'
// value.counter === 1

关于javascript - 模块模式是否需要使用 IIFE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51182478/

相关文章:

javascript - JavaScript 中的 (function() { } )() 结构是什么?

Javascript 闭包 - 无法在 IIFE 函数中保存 "count' 的副本

C++:是否使用 IIFE 线程安全初始化静态局部变量?

javascript - 幻灯片.js 不工作

javascript - 如何使用 Web RTC - Javascript 发送 UDP 数据包?

javascript - 自动添加类并在菜单关闭或正文点击正文时将其删除

javascript - IIFE 在防止名称冲突方面比 "named function declaration"有何优势?

javascript - IIFE 实际上是从哪里调用的?

javascript - 按单击按钮的顺序显示图像

javascript - 替换行索引的算法