本文寫於 2019 年 12 月 7 日
其實 es6 之後有了之後,很多之前的用法都沒必要了,立即執行函式就是其一。今天看到一道面試題:
請「用自己的語言」簡述
立即執行函式是什麼
立即執行函式有什麼用途
我愣了一下,突然發現自己不是很能清晰的解答這個概念。
我只知道()
代表了兩種作用:
立即執行函式該怎麼描述呢?
宣告乙個匿名函式,然後馬上呼叫這個匿名函式,就是立即執行函式?
的確,這就是乙個典型的立即執行函式。
首先宣告乙個匿名函式:function()
然後在匿名函式後面接一對括號 (),呼叫這個匿名函式。
那麼為什麼還要用另一對括號把匿名函式包起來呢?
其實是為了相容 js 的語法。
如果我們不加另一對括號,直接寫成:
function()()
瀏覽器會報語法錯誤!
想要通過瀏覽器的語法檢查,必須加點小東西,比如下面幾種
;(function () )()(
// 用括號把整個表示式包起來
function ()
)() //用括號把函式包起來
!(function () )() + // 求反,我們不在意值是多少,只想通過語法檢查。
(function () )() -
(function () )()
~(function () )()
void (function () )()
new (function () )()
目前我也不是很清楚為什麼,但是這些都是實驗證明不會報錯的寫法。(所以大家都說 js 詭異)
立即執行函式有什麼用呢?
只有乙個作用:建立乙個獨立的作用域。
這個作用域裡面的變數,外面訪問不到(即避免「變數汙染」)。
var lilist = ul.getelementsbytagname('li')
for (var i = 0; i < 6; i++)
}
為什麼 alert 的總是 6 呢,因為 i 是貫穿整個作用域的,而不是給每個 li 分配了乙個 i!
怎麼解決這個問題呢?
用立即執行函式給每個 li 創造乙個獨立作用域即可:
var lilist = ul.getelementsbytagname('li')
for (var i = 0; i < 6; i++)
})(i)
}
在立即執行函式執行的時候,i 的值被賦值給 ii,此後 ii 的值一直不變。
i 的值從 0 變化到 5,對應 6 個立即執行函式,這 6 個立即執行函式裡面的 ii 「分別」是 0、1、2、3、4、5。
但是這是用var
宣告,如果使用了let
,不會出現這種問題!!!!!!
這就是立即執行函式的基本概念。
(完)
js立即執行函式
void function func function param function param param function function function 這些可能在平時寫一些普通指令碼的時候不會用,也不常見,但是當你看別人的原始碼的時候就會發現,特別是一些js的外掛程式時候,是很常見的,初...
js 立即執行函式
先來兩種常見的格式吧 function 形參列表 實參列表 function 形參列表 實參列表 以上兩種都是常見的立即執行函式的形式。那麼,這樣寫的原因是什麼?我們只能這麼去寫嘛?原因是有的,當然也還有別的寫法 立即執行函式其實有這樣的規則 函式表示式 這個括號叫做執行符號。函式宣告包括函式定義和...
js 立即執行函式
立即執行函式其實就是函式的呼叫。形如 function function 要理解函式表示式 函式宣告 以及匿名函式 函式宣告function funname 函式表示式var funname function 呼叫函式的方式都為funname 需要用函式名進行呼叫。匿名函式 function 是沒有...