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

时间:2018-07-05 01:57:09

标签: javascript iife

在Udacity课程中,它说了关于模块模式的冲突:

  

模块模式要求使用IIFE的

  

“模块模式”的核心是作用域,闭包和(通常)IIFE。

因此,如果我理解正确,那么模块模式需要使用闭包,但是闭包是否需要位于IIFE中?

1 个答案:

答案 0 :(得分:2)

在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-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