函數(shù)在實際開發(fā)應(yīng)用當(dāng)中拳锚,大概分為普通函數(shù)/匿名函數(shù)/自執(zhí)行函數(shù)/構(gòu)造函數(shù)/其中普通函數(shù)分為函數(shù)表達(dá)式谬运,函數(shù)聲明兩種。
在javascript當(dāng)中醋奠,聲明有兩種聲明方式幢竹,第一種是var變量聲明耳峦,第二種就是函數(shù)function聲明,在執(zhí)行上下文焕毫,創(chuàng)建變量對象的時候蹲坷,函數(shù)聲明的優(yōu)先級比變量聲明要高,所以在執(zhí)行上下文當(dāng)中邑飒,無論在什么位置聲明了函數(shù)循签,我們都可以直接使用。
函數(shù)表達(dá)式
函數(shù)表達(dá)式語法:var fn = function(){};
是將一個函數(shù)賦值給一個變量聲明疙咸,在執(zhí)行上下文的時候懦底,我們應(yīng)該以變量聲明的方式去判斷函數(shù)表達(dá)式
使用var聲明運行了兩布
var fn = undefined ?// 聲明變量fn = undefined
fn = function(){} ?//將值賦給變量
因為函數(shù)表達(dá)式與函數(shù)聲明的聲明方式不一樣,所有有一點聲明上的差異罕扎,在使用方式上面并無不同聚唐。
一般使用的場景為給函數(shù)添加方法,給構(gòu)造函數(shù)加方法之類的腔召。
匿名函數(shù)
匿名函數(shù)語法:function(){}
匿名函數(shù)故名意義杆查,就是一個沒有名字的函數(shù),使用場景多作為一個參數(shù)傳給函數(shù)
var fn = function(bar,img){
return bar + img
}
fn(function(){
return 1;
},30)
在以上的例子當(dāng)中臀蛛,將一個匿名函數(shù)作為參數(shù)傳給了fn函數(shù)表達(dá)式亲桦。
在執(zhí)行上下文創(chuàng)建的時候崖蜜,匿名函數(shù)作為anguments對象保存在了fn變量對象當(dāng)中
這個方式因為函數(shù)其實是在別動函數(shù)當(dāng)中執(zhí)行,所以也叫回調(diào)函數(shù)客峭;
自執(zhí)行函數(shù)與塊級作用域以及模塊化
因為js沒有塊級作用域豫领,所以我們一班用一個自執(zhí)行函數(shù)來模仿一個塊級作用域來提供一個獨立的執(zhí)行上下文,加上閉包舔琅,我們就可以將其模塊化等恐。
一個模塊包括:私有變量,私有方法备蚓,公用變量课蔬,公用方法;
根據(jù)作用域鏈的單向訪問郊尝,我們可以很輕易的創(chuàng)建私有變量和私有方法二跋。
而公用變量和方法,我們可以根據(jù)閉包的特性來做流昏,例如
函數(shù)編程式
函數(shù)可以賦值給其他變量扎即,也可以作為一個參數(shù)傳給其他函數(shù),也可以作為其他函數(shù)的返回值
只用表達(dá)式不用語句
表達(dá)式是一個單純的運算過程况凉,結(jié)果是肯定會返回值的铺遂;
而語句是一個過程,是沒有值的
函數(shù)編程式要求只用表達(dá)式不用語句
沒有副作用
副作用的意思是函數(shù)內(nèi)部與外部進行互動茎刚,比方說修改了外部變量的值
函數(shù)編程式強調(diào)沒有副作用,意思是函數(shù)要保持獨立撤逢,功能就是返回一個新的值膛锭,不會去修改不關(guān)于它的任何東西,