区别function
Iife最左边为(。编译器认为是iife,不是函数。
IIFE的目的是为了隔离作用域,防止污染全局命名空间
弥补scope的缺陷 用于隔离作用域
全局作用域 块级作用域 函数作用域
只有function才能实现作用域隔离,因此如果要将一段代码中的变量、函数等的定义隔离出来,只能将这段代码封装到一个函数中。
将代码封装到函数中的目的是为了复用。在JS中,当然声明函数的目的在大多数情况下也是为了复用,但是JS迫于作用域控制手段的贫乏,我们也经常看到只使用一次的函数:这通常的目的是为了隔离作用域了!既然只使用一次,那么立即执行好了!
IIFE构造单例模式
JS的模块就是函数,最常见的模块定义如下:
functionmyModule(){
varsomeThing=”123″;
varotherThing=[1,2,3];
functiondoSomeThing(){
console.log(someThing);
}
functiondoOtherThing(){
console.log(otherThing);
}
return{
doSomeThing:doSomeThing,
doOtherThing:doOtherThing
}
}
varfoo=myModule();
foo.doSomeThing();
foo.doOtherThing();
varfoo1=myModule();
foo1.doSomeThing();
如果需要一个单例模式的模块,那么可以利用IIFE:
var myModule=(functionmodule(){
varsomeThing=”123″;
varotherThing=[1,2,3];
functiondoSomeThing(){
console.log(someThing);
}
functiondoOtherThing(){
console.log(otherThing);
}
return{
doSomeThing:doSomeThing,
doOtherThing:doOtherThing
}
})();
myModule.doSomeThing();
myModule.doOtherThing()