函數(shù)在實(shí)際開(kāi)發(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)建變量對(duì)象的時(shí)候,函數(shù)聲明的優(yōu)先級(jí)比變量聲明要高,所以在執(zhí)行上下文當(dāng)中,無(wú)論在什么位置聲明了函數(shù),我們都可以直接使用。
函數(shù)表達(dá)式
函數(shù)表達(dá)式語(yǔ)法:var fn = function(){};
是將一個(gè)函數(shù)賦值給一個(gè)變量聲明,在執(zhí)行上下文的時(shí)候,我們應(yīng)該以變量聲明的方式去判斷函數(shù)表達(dá)式
使用var聲明運(yùn)行了兩布
var fn = undefined ?// 聲明變量fn = undefined
fn = function(){} ?//將值賦給變量
因?yàn)楹瘮?shù)表達(dá)式與函數(shù)聲明的聲明方式不一樣,所有有一點(diǎn)聲明上的差異,在使用方式上面并無(wú)不同。
一般使用的場(chǎng)景為給函數(shù)添加方法,給構(gòu)造函數(shù)加方法之類的。
匿名函數(shù)
匿名函數(shù)語(yǔ)法:function(){}
匿名函數(shù)故名意義,就是一個(gè)沒(méi)有名字的函數(shù),使用場(chǎng)景多作為一個(gè)參數(shù)傳給函數(shù)
var fn = function(bar,img){
return bar + img
}
fn(function(){
return 1;
},30)
在以上的例子當(dāng)中,將一個(gè)匿名函數(shù)作為參數(shù)傳給了fn函數(shù)表達(dá)式。
在執(zhí)行上下文創(chuàng)建的時(shí)候,匿名函數(shù)作為anguments對(duì)象保存在了fn變量對(duì)象當(dāng)中
這個(gè)方式因?yàn)楹瘮?shù)其實(shí)是在別動(dòng)函數(shù)當(dāng)中執(zhí)行,所以也叫回調(diào)函數(shù);
自執(zhí)行函數(shù)與塊級(jí)作用域以及模塊化
因?yàn)閖s沒(méi)有塊級(jí)作用域,所以我們一班用一個(gè)自執(zhí)行函數(shù)來(lái)模仿一個(gè)塊級(jí)作用域來(lái)提供一個(gè)獨(dú)立的執(zhí)行上下文,加上閉包,我們就可以將其模塊化。
一個(gè)模塊包括:私有變量,私有方法,公用變量,公用方法;
根據(jù)作用域鏈的單向訪問(wèn),我們可以很輕易的創(chuàng)建私有變量和私有方法。
而公用變量和方法,我們可以根據(jù)閉包的特性來(lái)做,例如
函數(shù)編程式
函數(shù)可以賦值給其他變量,也可以作為一個(gè)參數(shù)傳給其他函數(shù),也可以作為其他函數(shù)的返回值
只用表達(dá)式不用語(yǔ)句
表達(dá)式是一個(gè)單純的運(yùn)算過(guò)程,結(jié)果是肯定會(huì)返回值的;
而語(yǔ)句是一個(gè)過(guò)程,是沒(méi)有值的
函數(shù)編程式要求只用表達(dá)式不用語(yǔ)句
沒(méi)有副作用
副作用的意思是函數(shù)內(nèi)部與外部進(jìn)行互動(dòng),比方說(shuō)修改了外部變量的值
函數(shù)編程式強(qiáng)調(diào)沒(méi)有副作用,意思是函數(shù)要保持獨(dú)立,功能就是返回一個(gè)新的值,不會(huì)去修改不關(guān)于它的任何東西,