日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IIFE(立即执行函数表达式)

發(fā)布時間:2023/12/2 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IIFE(立即执行函数表达式) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我們經(jīng)常會看到這樣的寫法:

;(fuction () {// do something })()

這就是一個簡單的IIFE(立即執(zhí)行函數(shù)表達式,immediately-invoked function expression)了。

這樣的寫法有什么好處呢?來簡單分析一下。

1. 開頭的分號

我們都知道,js是可以加分號或者不加分號的,在某些情況下,不加分號會讓解析器解析出錯,舉個例子:

var a = 0, b = 0 ; a = b 3 (b = a) // Uncaught TypeError: 3 is not a function

解析代碼的時候,a = b 3和(b = a)這兩條語句之間沒有明確的分界,回車和空格會自動被忽略。解析器會認為這是一句。所以,此時會認為3是一個函數(shù),b=a是他的參數(shù)。
在知乎的這個問題下,尤大做了解釋。

真正會導(dǎo)致上下行解析出問題的 token 有 5 個:括號,方括號,正則開頭的斜杠,加號,減號。我還從沒見過實際代碼中用正則、加號、減號作為行首的情況,所以總結(jié)下來就是一句話:一行開頭是括號或者方括號的時候加上分號就可以了,其他時候全部不需要。其實即使是這兩種情況,在實際代碼中也頗為少見。

ok,回到我們的例子,我們的例子就是以括號開頭的,如果上一個語句沒有加分號,很可能會出現(xiàn)這樣問題,這個分號就是為了防止這樣的情況發(fā)生,稱之為防御性分號。

2. function(){}

函數(shù)有兩種聲明方式:

function foo () {} var foo = function () {}

這兩種聲明方式的不同之處在于,使用var聲明的函數(shù)不會自動提升到頂部。也就是說,不能在var聲明函數(shù)的語句之前調(diào)用函數(shù),否則會拋出undefined的錯誤。
function () {}這種形式被稱為匿名函數(shù)。匿名函數(shù)沒有名字,也就是沒有指針,是無法在其他地方調(diào)用的。
將匿名函數(shù)賦值給foo,則可以通過foo來調(diào)用。
當(dāng)然還有辦法調(diào)用它,就是例子中的兩對括號。第一對括號將匿名函數(shù)包裝成了一個表達式,而第二對括號意思就是立即執(zhí)行它。

function () {console.log('a')} // 報錯 Uncaught SyntaxError: Unexpected token ( (function () {console.log('a')}) // 返回函數(shù)定義 ? () {console.log('a')},沒有l(wèi)og (function () {console.log('a')})() // a function foo() {console.log('a')}() // 報錯 Uncaught SyntaxError: Unexpected token )

第一行,因為不是合法的聲明方式,希望找到函數(shù)名的地方是‘(’,所以拋出了該異常。
第二行,()中的語句被當(dāng)成了表達式,解析器會認為是var聲明的方式。
第三行,自執(zhí)行。
第四行,function foo() {console.log('a')}是正確的函數(shù)聲明方式,被正確解析。接下來的一對括號依次解析,括號里需要有表達式,但是沒有,所以會拋出這樣的異常。

3. 好處

IIFE的好處就是不會污染全局變量,就在當(dāng)前的函數(shù)體的作用域下進行操作,保證了父作用域的干凈,如果return出一些函數(shù),那這些函數(shù)就形成了閉包。
我們常用IIFE來寫module。

var counter = (function(){var i = 0;return {get: function(){return i;},set: function( val ){i = val;},increment: function() {return i;}}; })()

Refer:

  • 維基百科:立即調(diào)用函數(shù)表達式
  • 知乎:JavaScript 語句后應(yīng)該加分號么?

  • 更多專業(yè)前端知識,請上 【猿2048】www.mk2048.com

    總結(jié)

    以上是生活随笔為你收集整理的IIFE(立即执行函数表达式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。