js中IIFE(立即執(zhí)行函數(shù)表達(dá)式)到底是咋來(lái)的?
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
介紹IIFE(Immediately Invoked Function Expression),中文名稱:立即執(zhí)行函數(shù)表達(dá)式,其實(shí)IIFE最早并不叫這個(gè)名字,而是叫做 2010年11月5日,Ben Alman寫(xiě)下來(lái)他的著名文章:Immediately-Invoked Function Expression (IIFE),標(biāo)志著IIFE這個(gè)名字的誕生。 在文章中,Ben Alman稱他是一個(gè)對(duì)待術(shù)語(yǔ)非常嚴(yán)謹(jǐn)?shù)娜?,之前他多次看?code style="font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace, sans-serif; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; background-color: rgb(251, 229, 225); color: rgb(192, 52, 29); border: none !important;">Self-Executing Anonymous Function這個(gè)說(shuō)法,覺(jué)得不是很恰當(dāng),于是他提出了 IIFE到底是咋來(lái)的?當(dāng)我們定義一個(gè)函數(shù)或者一個(gè)函數(shù)表達(dá)式時(shí),你得到的是一個(gè)名字,通過(guò)這個(gè)名字,你就可以調(diào)用這個(gè)函數(shù)。 下面這兩段代碼,第一個(gè)定義了一個(gè)普通函數(shù),第二個(gè)定義了一個(gè)函數(shù)表達(dá)式,這兩種形式,我們都可以通過(guò)標(biāo)識(shí)符
也就是說(shuō),當(dāng) 然而函數(shù)聲明是無(wú)法直接調(diào)用的,所以下面的寫(xiě)法會(huì)導(dǎo)致錯(cuò)誤:
我們來(lái)分析一下,上面這段代碼,javascript解釋器會(huì)將其解釋為一個(gè)函數(shù)聲明,和一個(gè)分組操作符( 那我們就給它一個(gè)表達(dá)式:
這回代碼不報(bào)錯(cuò)了,但是這段代碼毫無(wú)意義,這個(gè)函數(shù)并沒(méi)有執(zhí)行,實(shí)際上這段代碼與下面的代碼等價(jià):
它的返回值就是1,這不是我們想要的結(jié)果,我們需要函數(shù)定義后能立即被執(zhí)行,那就需要我們告訴javascript解釋器,這個(gè)函數(shù)是一個(gè)表達(dá)式,而不是一個(gè)聲明,因?yàn)楸磉_(dá)式可以立即執(zhí)行,但是聲明不能。 而在javascript中,生成表達(dá)式最簡(jiǎn)單的方式就是用
這樣函數(shù)聲明就變成了一個(gè)函數(shù)表達(dá)式,但是這個(gè)表達(dá)式?jīng)]有名字,我們沒(méi)法調(diào)用它,我們先給它一個(gè)名字,然后通過(guò)名字調(diào)用它。
這樣完全沒(méi)有問(wèn)題,但是這里的
是等價(jià)的,既然
將
IIFE的變種由上面介紹可知,生成IIFE的精髓就是 這個(gè)變種利用賦值運(yùn)算符
下面的表中使用邏輯運(yùn)算符來(lái)生成表達(dá)式。
還有下面這些,都是利用一元運(yùn)算符來(lái)生成函數(shù)表達(dá)式。
最后來(lái)一個(gè)不為人知的,
還有使用
這些方式都比較偏門(mén)了,不建議使用,只是用來(lái)幫助我們理解IIFE的。 為什么Self-Executing Anonymous Function這個(gè)名字不好?
Self-Executing:這個(gè)名字暗示函數(shù)會(huì)調(diào)用自己,但是實(shí)際上函數(shù)是立即被執(zhí)行的,而不是調(diào)用它自身。
Anonymous:這個(gè)名字暗示函數(shù)是匿名的,但實(shí)際上函數(shù)可以有名字,也可以沒(méi)有名字,比如下面的例子:
轉(zhuǎn)自https://www.cnblogs.com/graphics/p/18959048 該文章在 2025/7/3 9:12:40 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |