前言:早上在看《JavaScript設(shè)計模式與開發(fā)實踐》一書的時候褒翰,看到立即執(zhí)行函數(shù)一詞苍狰,仔細(xì)想了下對立即執(zhí)行函數(shù)(IIFE)好像也不是很了解露筒,雖然很基礎(chǔ)耻涛,但是自己之前都略過去了废酷。所以花點時間補(bǔ)充一下瘟檩。
概念:聲明一個匿名函數(shù),然后馬上調(diào)用這個函數(shù)澈蟆。
理解:一個獨立的詞法作用域墨辛。不僅避免了外界訪問此 IIFE 中的變量,而且又不會污染全局作用域丰介。
一背蟆、函數(shù)的基本寫法
// 1.函數(shù)聲明
// getNum(1) // 不會報錯,正常執(zhí)行
function getNum(num) {
console.log(num);
}
// 2.函數(shù)表達(dá)式
// getNum2(2) // 報錯哮幢,not defined
const getNum2 = function (num) {
console.log(num);
}
二带膀、立即執(zhí)行函數(shù)的寫法
錯誤示范
function getNum3() {
// console.log(3); // SyntaxError: Unexpected token )
}();
???但是這樣寫卻是可以的
const getNum4 = function () {
// console.log(4); // 4
}();
原因是 JavaScript 引擎看到 function 關(guān)鍵字會認(rèn)為這是函數(shù)聲明語句,不應(yīng)該以()結(jié)尾橙垢。
所以要解決這個問題就要讓引擎知道垛叨,()前面部分不是函數(shù)定義語句,而是一個表達(dá)式柜某,可以對此進(jìn)行運(yùn)算嗽元。
比如給前面表達(dá)式加上(),()具有優(yōu)先級喂击,先執(zhí)行剂癌,或者使用運(yùn)算符 + - !~ 等
這種情況下 JavaScript 引擎就會認(rèn)為這是一個表達(dá)式翰绊,而不是函數(shù)聲明佩谷,比如
!function(a){
console.log(a); // 1
}(1);
+function(a){
console.log(a); // 1
}(1);
一般寫法
// IIFE第一種方法
(function (num) {
console.log(num); // 5
})(5);
// IIFE第二種寫法
(function (num) {
console.log(6); // 6
}(6));
使用場景
比較出名的就是 jQuery 的封裝寫法,同理监嗜,立即執(zhí)行函數(shù)大多是用在封裝插件和庫當(dāng)中谐檀,避免被外界影響和污染全局。
暫時寫這些裁奇,后續(xù)再碰到或者加深了理解再回來修改桐猬!