在 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 引入了 const
和 let
声明允许 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/