我的前端入門筆記--js中(function(){…})()立即執(zhí)行函數(shù)寫法理解

立即執(zhí)行函數(shù)的常見類型有如下幾種:
(1)function外面加括號

(function(){alert(1);})(); 

(2)最前最后加括號

(function(){alert(1);}()); 

(3)function前面加運(yùn)算符,常見的是!與void

!function(){alert(1);}(); 
void function(){alert(2);}();  

最常用的是前兩種,要理解立即執(zhí)行函數(shù)先理解以下幾個(gè)概念:

函數(shù)聲明:function fnName () {…};使用function關(guān)鍵字聲明一個(gè)函數(shù),再指定一個(gè)函數(shù)名,叫函數(shù)聲明。

函數(shù)表達(dá)式: var fnName = function () {…};使用function關(guān)鍵字聲明一個(gè)函數(shù),但未給函數(shù)命名,最后將匿名函數(shù)賦予一個(gè)變量,叫函數(shù)表達(dá)式,這是最常見的函數(shù)表達(dá)式語法形式。

匿名函數(shù):function () {}; 使用function關(guān)鍵字聲明一個(gè)函數(shù),但未給函數(shù)命名,所以叫匿名函數(shù),匿名函數(shù)屬于函數(shù)表達(dá)式,匿名函數(shù)有很多作用,賦予一個(gè)變量則創(chuàng)建函數(shù),賦予一個(gè)事件則成為事件處理程序或創(chuàng)建閉包等等。

函數(shù)聲明和函數(shù)表達(dá)式不同之處:
一、Javascript引擎在解析javascript代碼時(shí)會‘函數(shù)聲明提升’(Function declaration Hoisting)當(dāng)前執(zhí)行環(huán)境(作用域)上的函數(shù)聲明,而函數(shù)表達(dá)式必須等到Javascirtp引擎執(zhí)行到它所在行時(shí),才會從上而下一行一行地解析函數(shù)表達(dá)式;
二、函數(shù)表達(dá)式后面可以加括號立即調(diào)用該函數(shù),函數(shù)聲明不可以,只能以fnName()形式調(diào)用

fnName();
function fnName(){
    ...
}//正常,因?yàn)椤嵘撕瘮?shù)聲明,函數(shù)調(diào)用可在函數(shù)聲明之前
  
fnName();
var fnName=function(){
    ...
}//報(bào)錯,變量fnName還未保存對函數(shù)的引用,函數(shù)調(diào)用必須在函數(shù)表達(dá)式之后
 
var fnName=function(){
    alert('Hello World');
}();//函數(shù)表達(dá)式后面加括號,當(dāng)javascript引擎解析到此處時(shí)能立即調(diào)用函數(shù)
 
function fnName(){
    alert('Hello World');
}();//不會報(bào)錯,但是javascript引擎只解析函數(shù)聲明,忽略后面的括號,函數(shù)聲明不會被調(diào)用
 
function(){
    console.log('Hello World');    
}();//語法錯誤,雖然匿名函數(shù)屬于函數(shù)表達(dá)式,但是未進(jìn)行賦值操作,
//所以javascript引擎將開頭的function關(guān)鍵字當(dāng)做函數(shù)聲明,報(bào)錯:要求需要一個(gè)函數(shù)名

要在函數(shù)體后面加括號就能立即調(diào)用,則這個(gè)函數(shù)必須是函數(shù)表達(dá)式,不能是函數(shù)聲明。

(function(a){
    console.log(a);   //firebug輸出123,使用()運(yùn)算符
})(123);
  
(function(a){
    console.log(a);   //firebug輸出1234,使用()運(yùn)算符
}(1234));
  
!function(a){
    console.log(a);   //firebug輸出12345,使用!運(yùn)算符
}(12345);
  
+function(a){
    console.log(a);   //firebug輸出123456,使用+運(yùn)算符
}(123456);
  
-function(a){
    console.log(a);   //firebug輸出1234567,使用-運(yùn)算符
}(1234567);
  
var fn=function(a){
    console.log(a);   //firebug輸出12345678,使用=運(yùn)算符
}(12345678)

可以看到輸出結(jié)果,在function前面加!、+、 -甚至是逗號等到都可以起到函數(shù)定義后立即執(zhí)行的效果,而()、!、+、-、=等運(yùn)算符,都將函數(shù)聲明轉(zhuǎn)換成函數(shù)表達(dá)式,消除了javascript引擎識別函數(shù)表達(dá)式和函數(shù)聲明的歧義,告訴javascript引擎這是一個(gè)函數(shù)表達(dá)式,不是函數(shù)聲明,可以在后面加括號,并立即執(zhí)行函數(shù)的代碼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容