在JavaScript中,我們使用function關(guān)鍵字加函數(shù)名定義一個(gè)函數(shù)钮莲,比如這樣:function myFun(){ // 函數(shù)體 }
免钻,然后通過函數(shù)名加括號myFun()
可以調(diào)用執(zhí)行彼水。如果我們在定義函數(shù)的時(shí)候就讓函數(shù)執(zhí)行,而且后面不需要再次調(diào)用极舔,這種函數(shù)就可以使用匿名函數(shù)凤覆。匿名函數(shù),顧名思義就是定義函數(shù)的時(shí)候沒有函數(shù)名拆魏,但是在JavaScript中盯桦,沒有函數(shù)名的函數(shù)會(huì)報(bào)錯(cuò),這里就有了立即執(zhí)行函數(shù)渤刃,也叫函數(shù)自執(zhí)行拥峦。立即執(zhí)行函數(shù)就是聲明函數(shù)的時(shí)候立即調(diào)用的意思,它最重要的作用就是創(chuàng)建了一個(gè)獨(dú)立的作用域卖子,而且很多的第三方庫都大量的用到了立即執(zhí)行函數(shù)事镣。
函數(shù)的聲明與調(diào)用
下面我們使用標(biāo)準(zhǔn)的寫法定義和調(diào)用一個(gè)函數(shù)
function myFun() {
alert("Hello World!");
}
myFun();//Hello World!
正如上面,當(dāng)我們調(diào)用函數(shù)的時(shí)候揪胃,函數(shù)執(zhí)行出現(xiàn)Hello World彈框璃哟,如果我們要它立即執(zhí)行,寫法如下:
function(){
alert("Hello World!");
}
// 報(bào)錯(cuò)了
上面的函數(shù)沒有函數(shù)名所以報(bào)錯(cuò)喊递,我們把它看作一個(gè)整體用小括號包裹随闪,后面再用小括號調(diào)用就是立即執(zhí)行函數(shù)了。
(function(){
alert("Hello World!");
})();
立即執(zhí)行函數(shù)表達(dá)式
上面的立即執(zhí)行函數(shù)是標(biāo)準(zhǔn)的寫法骚勘,此外還可以寫成立即執(zhí)行函數(shù)表達(dá)式的語法铐伴,就是把匿名函數(shù)加括號執(zhí)行看作一個(gè)整體,然后用小括號將他們括起來俏讹。
(function(){
alert("Hello World!");
}());
看著很相似当宴,其實(shí)效果也一模一樣,只是把執(zhí)行函數(shù)的括號放到里面了泽疆,也是立即執(zhí)行函數(shù)的另一種寫法户矢。
參數(shù)和返回值
立即執(zhí)行函數(shù)的返回值其實(shí)也就是立即執(zhí)行函數(shù)本身,我們可以用變量將返回值儲(chǔ)存殉疼。
var str = (function(){
return "Hello World!";
})();
console.log(str);//Hello World!
立即執(zhí)行函數(shù)和普通函數(shù)一樣梯浪,可以通過調(diào)用的括號來傳遞參數(shù)
var i = "Hello World!";
(function(j){
alert(j);
})(i);
其中i是實(shí)參,在全局中賦值為 Hello World! ,而j是形參瓢娜,用于匿名函數(shù)內(nèi)部傳遞挂洛。
私有作用域
文章開始也提到過,立即執(zhí)行函數(shù)最重要的作用就是可以創(chuàng)建一個(gè)獨(dú)立的作用域眠砾。對于原本不支持私有屬性的JavaScript而言虏劲,我們可以使用立即執(zhí)行函數(shù)模擬私有空間。比如上篇文章講閉包的案例可以優(yōu)化一下
var math = (function () {
return {
add : function (x,y) {
return x + y;
},
multi : function (x,y) {
return x * y;
}
};
})();
console.log(math.add(2,5));//7
console.log(math.multi(2,5));//10