什么是 IIFE
(function(){
// _...do something...
})();
如上所示,在函數(shù)聲明的外面加上一對圓括號,并在結(jié)尾處再加上一對括號,此函數(shù)在聲明完成之后,會立刻執(zhí)行。這種用法就叫做:立即執(zhí)行函數(shù)。
通過使用圓括號包裹我們的函數(shù), 我們告訴解釋器以函數(shù)表達式的方式解析JavaScript代碼 , 而不是函數(shù)聲明。
該表達式返回一個函數(shù)對象:
var f = (function() {
console.log("hello world!")
})
console.log(typeof f) // function
console.log(f instanceof Object) // true
事實上,任何操作一個函數(shù)并返回此函數(shù)的表達式,均可以生成 立即執(zhí)行函數(shù) ,以下寫法均合法:
-function() {
console.log("hello world!")
}()
*function() {
console.log("hello world!")
}()
/function() {
console.log("hello world!")
}()
&function() {
console.log("hello world!")
}()
,function() {
console.log("hello world!")
}()
立即函數(shù)有什么作用
我們知道了立即函數(shù)的實際行為:創(chuàng)建了一個函數(shù)表達式,并立即執(zhí)行。那么為什么我們需要使用 IIFE ?
私有性
在 JavaScript 中,變量所在的作用域在包含它們的函數(shù)中,這意味著不能從函數(shù)體的外部訪問到這些變量:
(function() {
var secret = 64
})()
console.log(secret) // ReferenceError: secret is not defined
這允許我們在函數(shù)私有的變量和數(shù)據(jù)不被侵擾的情況下使用這些變量和數(shù)據(jù)。
雖然使用命名函數(shù)也可以達到同樣的效果,但是 IIFE 不會污染全局命名空間。