在看bootStrap插件的時候發現這種寫法函數
!function(){}這種寫法,不解,後來看到網上的文章才知道,這是匿名函數的一種寫法spa
1. 什麼是自執行的匿名函數?
它是指形如這樣的函數: (function {// code})();
2. 疑問
爲何(function {// code})();能夠被執行, 而function {// code}();卻會報錯?
3. 分析
(1). 首先, 要清楚二者的區別:
(function {// code})是表達式, function {// code}是函數聲明.
(2). 其次, js"預編譯"的特色:
js在"預編譯"階段, 會解釋函數聲明, 但卻會忽略表式.
(3). 當js執行到function() {//code}();時, 因爲function() {//code}在"預編譯"階段已經被解釋過, js會跳過function(){//code}, 試圖去執行();, 故會報錯;
當js執行到(function {// code})();時, 因爲(function {// code})是表達式, js會去對它求解獲得返回值, 因爲返回值是一 個函數, 故而遇到();時, 便會被執行.插件
另外, 函數轉換爲表達式的方法並不必定要靠分組操做符(),咱們還能夠用void操做符,~操做符,!操做符……code
如:string
!
function
(){
alert(
"另類的匿名函數自執行"
);
}();