一:什麼是立即執行函式?
宣告乙個函式,並馬上呼叫這個匿名函式就叫做立即執行函式;也可以說立即執行函式是一種語法,讓你的函式在定義以後立即執行;
//(function (){}()) w3c標準
//(function (){})()
//只有表示式才被執行符號執行
//+ function ()(); 立即執行函式的方法還有一些
(function
()())
//我的理解就是 :
立即執行函式後函式被清除
二:立即執行函式的寫法:
有時,我們定義函式之後,立即呼叫該函式,這時不能在函式的定義後面直接加圓括號,這會產生語法錯誤。產生語法錯誤的原因是,function 這個關鍵字,既可以當做語句,也可以當做表示式,比如下邊:
//語句
function fn() {};
//表示式
var fn = function (){};
為了避免解析上的歧義,js引擎規定,如果function出現在行首,一律解析成語句。因此js引擎看到行首是function關鍵字以後,認為這一段都是函式定義,不應該以原括號結尾,所以就報錯了。
解決方法就是不要讓function出現在行首,讓js引擎將其理解為乙個表示式,最簡單的處理就是將其放在乙個圓括號裡,比如下邊
(function()())
(function
())()
上邊的兩種寫法,都是以圓括號開頭,引擎會意味後面跟的是表示式,而不是乙個函式定義語句,所以就避免了錯誤,這就叫做"立即呼叫的函式表示式"。
立即執行函式,還有一些其他的寫法(加一些小東西,不讓解析成語句就可以),比如下邊:
(function () ()) //用括號把整個表示式包起來
(function () )() //
用括號把函式包起來
!function () () //
求反,我們不在意值是多少,只想通過語法檢查
+function () ()
-function () ()
~function () ()
void
function () ()
newfunction () ()
三:立即執行函式的作用:
不必為函式命名,避免了汙染全域性變數
立即執行函式內部形成了乙個單獨的作用域,可以封裝一些外部無法讀取的私有變數
封裝變數
總而言之:立即執行函式會形成乙個單獨的作用域,我們可以封裝一些臨時變數或者區域性變數,避免汙染全域性變數
為什麼alert總是3? 因為i是貫穿整個作用域的,而不是給每乙個li分配乙個i,點選事件使非同步,使用者一定是在for執行完了以後,才點選,此時i已經變成3了。
那麼怎麼解決這個問題呢,可以用立即執行函式,給每個li建立乙個獨立的作用域
,在立即執行函式執行的時候,i的值從0到2,對應三個立即執行函式,這3個立即執行函式裡邊的j分別是0,1,2所以就能正常輸出了,看下邊例子:
未完待更...
立即執行函式
函式宣告 函式表示式 匿名函式 函式宣告 function fnname 使用function關鍵字宣告乙個函式,再指定乙個函式名,叫函式宣告。函式表示式 var fnname function 使用function關鍵字宣告乙個函式,但未給函式命名,最後將匿名函式賦予乙個變數,叫函式表示式,這是最...
立即執行函式
一 立即執行函式 立即執行函式,顧名思義,就是能立即執行的函式 一般的,函式的執行都遵循著先宣告,後呼叫的原則,無論是函式表示式還是函式宣告 1 函式宣告 宣告 function sayhello 呼叫 sayhello hello 2 函式表示式 宣告 var sayhello function ...
立即執行函式
針對初始化功能的函式 好處 執行一次之後就銷毀,不占用空間,立即執行函式依然可以有返回值 基本形式 function 建議使用這種寫法 function 數學符號優先順序比較高,第一種方法的原因就是這樣,會先執行裡面的 括號的優先順序比較低 只有表示式才能被執行 function test 函式宣告...