5.1對於函數表達式,在後面加括號即可以讓函數立即執行;例如下面這個函數,至於爲什麼加了括號就可以立即執行,我們可以這麼理解,就是像fn1();這樣寫的話,函數 可以立即執行是沒問題的,我們在經常會用到,那麼對於函數表達式來說,fn1就是對後面的匿名函數的一個引用,因此在後面的匿名函數後直接加括號,自然也就可以立即執行
函數表達式立即執行
5.2但是對於下面這個函數,如果直接加()就會報錯;如果按照上面的思路去理解,在匿名函數後面直接加上()應該是可以立即執行的,但是下面這個函數之所以會報錯,而且會報兩個錯誤,是因爲js引擎在解析js代碼的時候,遇到以function打頭的函數會當做函數聲明,然後會檢查語法錯誤,那麼第一個括號處的語法錯誤在於函數聲明是必須要有函數名字的,而()前面沒有所以報錯;第二個括號處的語法錯誤在於函數聲明到第二個花括號處,就已經算是結尾了,後面的()會被當作分組操作符,這個()實際上已經和函數聲明沒關係了,但是既然有了分組操作符,那就要有表達式,不然會報錯;
函數聲明想要立即執行,會報錯
按照上面的分析,我們如果在第一個()前面加上函數名稱,在第二個()裏面加入表達式,那麼就不會報錯了,我們來看一下效果
改掉語法錯誤以後的函數聲明
可以看到修改了那兩處的問題以後,報錯消失了,但是這個時候函數並沒有執行,原因上面也已經提到了,就是一旦被當作函數聲明,那麼到花括號處就算爲止了,後面的()就只當作一個分組操作符,和函數沒有任何關係了
5.3那麼想讓這種匿名函數直接執行應該怎麼辦呢,其實很簡單,就是在function前面加上一些操作符,這樣js引擎在解析的時候就不會把它當成是函數聲明瞭
推薦使用的方法,看起來比較具有結構性
也是一種常用的寫法