日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

理解javascript中的立即執(zhí)行函數(shù)(function(){})()

 沙門空海 2018-12-11

之前看了好多代碼,都有用到這種函數(shù)的寫法,但是都沒認真的去想為什么會這樣寫,今天開始想學(xué)習(xí)下jquery的源碼,發(fā)現(xiàn)jquery也是使用這種方式,用(function(window, undefined){})(window)包裹內(nèi)部代碼,于是進一步的去學(xué)習(xí)了下。

要理解立即執(zhí)行函數(shù)(function(){})(),先了解些函數(shù)的基本概念(函數(shù)聲明、函數(shù)表達式、匿名函數(shù))。

函數(shù)聲明:使用function聲明函數(shù),并指定函數(shù)名。 

function setFn() {
    // coding   
}

函數(shù)表達式:使用function聲明函數(shù),但未指定函數(shù)名,將匿名函數(shù)賦予一個變量。

var setFn = function() {
    // coding
}

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

function() {
    // coding
}

函數(shù)聲明與函數(shù)表達式的不同在于:

1. 函數(shù)聲明可在當(dāng)前作用域下提前調(diào)用執(zhí)行,函數(shù)表達式需等執(zhí)行到該函數(shù)后,方可執(zhí)行,不可提前調(diào)用。

復(fù)制代碼
setFn()
function setFn() {
    // coding  
}
// 正常,函數(shù)聲明可提前調(diào)用

setFn()
var setFn = function() {
    // coding
} 
// 報錯,setFn未保存對函數(shù)的引用,函數(shù)調(diào)用需放在函數(shù)表達式后面
復(fù)制代碼

2. 函數(shù)表達式可直接在函數(shù)后加括號調(diào)用。

var setFn = function() {
    console.log(2)
}()

// 2   解析至此,可直接執(zhí)行調(diào)用

立即執(zhí)行函數(shù)(function(){})()可以看出很像函數(shù)表達式的調(diào)用,但為什么要加括號呢?如果不加括號:

復(fù)制代碼
function(){
    console.log(1)
}()

// 報錯,函數(shù)需要函數(shù)名

解析: 雖然匿名函數(shù)屬于函數(shù)表達式,但未進行賦值,所以javascript解析時將開頭的function當(dāng)做函數(shù)聲明,故報錯提示需要函數(shù)名
復(fù)制代碼

立即執(zhí)行函數(shù)里面的函數(shù)必須是函數(shù)表達式,所以由var setFn = function() {}()可以理解為在匿名函數(shù)前加了 = 運算符后,將函數(shù)聲明轉(zhuǎn)化為函數(shù)表達式,所以拿!,+,-,()...等運算符來測試下是否如此。

復(fù)制代碼
!function(){
    console.log(1)
}()
// 1
    
+function(){
    console.log(2)
}()
// 2
    
-function(){
    console.log(3)
}()
// 3
    
(function(){
    console.log(4)
})()
// 4
復(fù)制代碼

 

由此可見,加運算符確實可將函數(shù)聲明轉(zhuǎn)化為函數(shù)表達式,而之所以使用括號,是因為括號相對其他運算符會更安全,可以減少不必要的麻煩。

立即執(zhí)行函數(shù)與正常函數(shù)傳參形式是一致的。

(function(a, b){
    console.log(a + b);
})(1, 2)
// 3

(function(){}())這樣寫的好處是在內(nèi)部定義的變量不會跟外部的變量有沖突,達到保護內(nèi)部變量的作用。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多