嗯 也不知道怎么翻譯self-invoked,就當自調吧。
在看bootstrap的輪播插件源碼的時候發現一種新的自調函數的寫法(其實應該不新了),開頭的一段就卡住了,原諒我是個菜鳥,就順便記錄一下。stackoverflow上有大神們的回答在這里,輪播的函數形式如下:
!function ($) { //code here }(window.jQuery);
通常自調函數來模仿塊級作用域的方式是:
(function(parameters){ //這里是塊級作用域 })();
在function外面的這對括號使里面的匿名函數變成了函數表達式,並在之后馬上調用。這個相當於:
var Name=function(parameters){ //這里是塊級作用域 }; Name(); //調用匿名函數
函數表達式是在運行中以引用的方式賦值給一個變量的,如上面的函數創建的方式。而這里函數表達式和函數聲明是不一樣的,函數聲明的通常形式如下:
function Name(parameters){ //code here }
函數聲明會在程序剛開始運行的時候會被提升(所以可以在執行之后聲明),但是並不執行,直到被調用的時候再執行。
所以與括號作用相同的function前面的感嘆號,因為括號的優先級高於感嘆號,感嘆號使得后面的一整串內容變成了一個bool表達式,編譯器就會直接運行這個表達式了。這個表達式是個匿名函數,傳入了一個參數,這里命名成$,其實無所謂是什么,只是一個形參,並在自調的時候把jQuery對象傳進去,這里的jQuery對象是個全局變量,所以是windows.jQuery