javascript
JavaScript中的立即执行函数
原文鏈接
通常我們聲明一個函數有以下幾種方式:
// 聲明函數f1 function f1() {console.log("f1"); } // 通過()來調用此函數 f1();//一個匿名函數的函數表達式,被賦值給變量f2: var f2 = function() {console.log("f2"); } //通過()來調用此函數 f2();//一個命名為f3的函數的函數表達式(這里的函數名可以隨意命名,可以不必和變量f3重名),被賦值給變量f3: var f3 = function f3() {console.log("f3"); } //通過()來調用此函數 f3();復制代碼如果你看過一些自定義控件的話你會發現他們大多數都是沿用這種寫法:
(function() {復制代碼 // 這里開始寫功能需求
})();
我們發現這里f只是這個匿名函數的一個引用變量,那么既然f()能夠調用這個函數,我把f替換成函數本身可以么:
function(){console.log("f"); }();復制代碼運行之后得到如下結果:
Uncaught SyntaxError: Unexpected token (復制代碼產生這個錯誤的原因是,Javascript引擎看到function關鍵字之后,認為后面跟的是函數聲明語句,不應該以圓括號結尾。解決方法就是讓引擎知道,圓括號前面的部分不是函數定義語句,而是一個表達式,可以對此進行運算,這里區分一下函數聲明和函數表達式:
1、函數聲明(即我們通常使用function x(){}來聲明一個函數) function myFunction () { /* logic here */ } 2、函數表達式(類似以這種的形式) var myFunction = function () { /* logic here */ }; var myObj = {myFunction: function () { /* logic here */ } };復制代碼小學我們就學過用()括起來的表達式會先執行,就像下面這樣:
1+(2+3) //這里先運行小括號里面的內容沒有意見撒復制代碼其實在javascript中小括號也有相似的作用,Javascript引擎看到function關鍵字會認為是函數聲明語句,那么如果Javascript引擎優先看到小括號會怎么樣:
//用小括號把函數包裹起來 (function(){console.log("f"); })();復制代碼函數成功執行了:
f //控制臺輸出復制代碼這種情況下Javascript引擎就會認為這是一個表達式,而不是函數聲明,當然要讓Javascript引擎認為這是一個表達式的方法還有很多:
!function(){}(); +function(){}(); -function(){}(); ~function(){}(); new function(){ /* code */ } new function(){ /* code */ }() // 只有傳遞參數時,才需要最后那個圓括號。 ……復制代碼回到前面的問題,為什么說IIFE這種形式避免了污染全局變量,如果你見過別人寫的jquery插件,里面通常會有類似這樣的代碼:
(function($){復制代碼 //插件實現代碼
})(jQuery);
`` 這里的jquery其實是該匿名函數的參數,聯想一下我們調用匿名函數時候是用f()那么匿名帶參數的就是f(args)對吧,這里把jquery作為參數傳入該函數,那么在函數內部使用形參$的時候就不會影響到外部環境,因為有些插件也會用到$`這個限定符,你在這個函數內部可以隨意折騰。
以上,在此過程中參考了以下兩篇文章:
javascript立即執行某個函數:插件中function(){}()再思考
JavaScript中的立即執行函數
總結
以上是生活随笔為你收集整理的JavaScript中的立即执行函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql linux版安装
- 下一篇: 抢领英饭碗?Facebook测试简历功能