立即執行函式和使用場景

2022-09-12 09:48:15 字數 1867 閱讀 1102

宣告乙個函式,並馬上呼叫這個匿名函式就叫做立即執行函式;也可以說立即執行函式是一種語法,讓你的函式在定義以後立即執行;

立即執行函式的建立步驟,看下圖:

有時,我們定義函式之後,立即呼叫該函式,這時不能在函式的定義後面直接加圓括號,這會產生語法錯誤。產生語法錯誤的原因是,function 這個關鍵字,既可以當做語句,也可以當做表示式,比如下邊:

//

語句function

fn() {};

//表示式

var fn = function (){};

為了避免解析上的歧義,js引擎規定,如果function出現在行首,一律解析成語句。因此js引擎看到行首是function關鍵字以後,認為這一段都是函式定義,不應該以原括號結尾,所以就報錯了。

解決方法就是不要讓function出現在行首,讓js引擎將其理解為乙個表示式,最簡單的處理就是將其放在乙個圓括號裡,比如下邊:

(function

()())

(function

())()

上邊的兩種寫法,都是以圓括號開頭,引擎會意味後面跟的是表示式,而不是乙個函式定義語句,所以就避免了錯誤,這就叫做"立即呼叫的函式表示式"。

立即執行函式,還有一些其他的寫法(加一些小東西,不讓解析成語句就可以),比如下邊:

(function () ())   //

用括號把整個表示式包起來

(function () )() //

用括號把函式包起來

!function () () //

求反,我們不在意值是多少,只想通過語法檢查

+function () ()

-function () ()

~function () ()

void

function () ()

newfunction () ()

總而言之:立即執行函式會形成乙個單獨的作用域,我們可以封裝一些臨時變數或者區域性變數,避免汙染全域性變數1.怎樣使以下alert的結果為0,1,2:

為什麼alert總是3? 因為i是貫穿整個作用域的,而不是給每乙個li分配乙個i,點選事件使非同步,使用者一定是在for執行完了以後,才點選,此時i已經變成3了。

那麼怎麼解決這個問題呢,可以用立即執行函式,給每個li建立乙個獨立的作用域,在立即執行函式執行的時候,i的值從0到2,對應三個立即執行函式,這3個立即執行函式裡邊的j分別是0,1,2所以就能正常輸出了,看下邊例子:

當然,也可以使用es6的塊級作用域解決整個問題:

2.如何避免了汙染全域性變數某些**只需要執行一次,比如只需要顯示乙個時間,但是這些**也需要一些臨時的變數,但是初始化過程結束之後,就再也不會被用到,如果將這些變數作為全域性變數,不是乙個好的主意,我們可以用立即執行函式——去將我們所有的**包裹在它的區域性作用域中,不會讓任何變數洩露成全域性變數,看如下**:

比如上面的**,如果沒有被包裹在立即執行函式中,而是直接以非函式的形式直接寫在標籤裡面,雖然也會立即執行,但是臨時變數todaydom,days,today,year,month,date,day,msg都將成為全域性變數(初始化**遺留的產物)。

而用立即執行函式之後,這些變數都不會在全域性變數中存在,以後也不會其他地方使用,有效的避免了汙染全域性變數。

**:

mongodb 使用場景和不使用場景

1.mongodb介紹 mongodb 名稱來自 humongous 是乙個可擴充套件的高效能,開源,模式自由,面向文件的資料庫。它使用c 編寫。mongodb特點 a.面向集合的儲存 適合儲存物件及json形式的資料。b.動態查詢 mongo支援豐富的查詢表達方式,查詢指令使用json形式的標記,...

mongodb 使用場景和不使用場景

mongodb 使用場景和不使用場景 2012 09 26 10 30 18 分類 linux 1.mongodb介紹 mongodb 名稱來自 humongous 是乙個可擴充套件的高效能,開源,模式自由,面向文件的資料庫。它使用c 編寫。mongodb特點 a.面向集合的儲存 適合儲存物件及js...

mongodb 使用場景和不使用場景

1.mongodb介紹 mongodb 名稱來自 humongous 是乙個可擴充套件的高效能,開源,模式自由,面向文件的資料庫。它使用c 編寫。mongodb特點 a.面向集合的儲存 適合儲存物件及json形式的資料。b.動態查詢 mongo支援豐富的查詢表達方式,查詢指令使用json形式的標記,...