什麼是自執行函式

2021-09-12 09:15:50 字數 1706 閱讀 6738

這裡是修真院前端小課堂,本篇分析的主題是

【什麼是自執行函式】

在詳細講解自執行函式之前,我們先來說一下這個函式在叫法上的爭議。實際上不同的人對自執行函式的理解不太一樣,第一種理解是,自執行即自動執行,也就是大家平時所謂的立即執行函式。

還有一種理解,即自執行函式是在函式內部執行函式本身,即我們平時常說的遞迴函式。不管是哪種理解,我們都沒必要去糾結叫法上的準確與否,因為相比於自執行函式,立即執行函式和遞迴函式這兩種叫法是我們更加熟悉的,實際上平時也很少會看到自執行函式這種叫法。立即執行函式和遞迴函式都很重要,因此今天打算對兩種函式都做一下介紹。

知識點1:直接在函式後面加()就可以立即執行嗎?在函式宣告後面加括號為什麼會報錯?

知識點2:如何實現立即執行函式

知識點3:遞迴函式的幾種用法

對函式宣告以及函式表示式理解不夠深入

不知道立即執行函式的用法

見demo

對於函式表示式,在後面加括號即可以讓函式立即執行;例如下面這個函式,至於為什麼加了括號就可以立即執行,我們可以這麼理解,就是像fn1();這樣寫的話,函式 可以立即執行是沒問題的,我們在經常會用到,那麼對於函式表示式來說,fn1就是對後面的匿名函式的乙個引用,因此在後面的匿名函式後直接加括號,自然也就可以立即執行

varfn1=function() (1)

可以看到修改了那兩處的問題以後,報錯消失了,但是這個時候函式並沒有執行,原因上面也已經提到了,就是一旦被當作函式宣告,那麼到花括號處就算為止了,後面的()就只當作乙個分組操作符,和函式沒有任何關係了

那麼想讓這種匿名函式直接執行應該怎麼辦呢,其實很簡單,就是在function前面加上一些操作符,這樣js引擎在解析的時候就不會把它當成是函式宣告了

(functionfn2() (1))

以下為最簡單的遞迴函式,即在函式內部呼叫函式本身。

//遞迴函式

functionfun(num) elseelse);fun(5)

立即執行函式有哪些用處?

立即執行函式有很多用處,下面舉乙個例子:

在下面這個函式中,result是乙個函式陣列,希望達到的效果應該執行陣列中的任何乙個函式,得到的值都應該和該函式在陣列中的索引值是一樣的,但是實際情況是所有函式執行後得到的值都是10。之所以會這樣是因為result陣列取值的時候,是通過內部函式去返回外部變數i的值來取得的,由於內部函式會創造乙個自己的作用域鏈,作用域鏈中存放的是i這個外部變數物件,這個變數物件對內部函式來說只有乙個,for迴圈執行完成後的最後的值,即10;

這個問題可以通過在給result陣列取值外面加立即執行函式來解決,立即執行函式外面的()裡面是可以傳參的,下面這個用法中就是把外部變數i的值通過傳參傳給了num,然後把num的值又傳給了result,這樣最後函式陣列result中每乙個函式都是返回當時具體的值,即i當時的值,而不是i最後的值。

參考一:湯姆大叔的部落格之立即呼叫的函式表示式

函式這一部分,從執行環境、作用域鏈、函式宣告函式表示式,到閉包、建構函式和原型鏈都是連在一塊的,類似的函式問題大家都可以一起討論一下

課後問題:

閉包和匿名函式的區別?

答:匿名函式上面已經見過了,類似於常用函式表示式中,function後面直接接乙個(),沒有函式名字,即為匿名函式;閉包是在某個函式內部的函式,由於閉包的作用域鏈包含有外部函式的變數物件,因此它可以訪問外部函式變數,這個叫閉包

自執行函式

var a 2 function foo console.log a 2 由於函式被包含在一對 括號內部,因此成為了乙個表示式,通過在末尾加上另外乙個 可以立即執行這個函式,比如 function foo 第乙個 將函式變成表 達式,第二個 執行了這個函式。這種模式很常見,幾年前社群給它規定了乙個術...

JS自執行函式

函式表示式立即執行 函式宣告想要立即執行,會報錯 按照上面的分析,我們如果在第乙個 前面加上函式名稱,在第二個 裡面加入表示式,那麼就不會報錯了,我們來看一下效果 改掉語法錯誤以後的函式宣告 可以看到修改了那兩處的問題以後,報錯消失了,但是這個時候函式並沒有執行,原因上面也已經提到了,就是一旦被當作...

js自執行函式

方式1 最前最後加括號 function 方式2 function外面加括號 function 方式3 function前面加運算子 function 注 1 可以給立即執行函式傳遞引數 2 立即函式內部是可以訪問外部變數 3 立即執行函式模式被廣泛使用,它可以幫你封裝大量的工作而不會在背後遺留任何...