JavaScript 函數(shù)

一鞋喇、什么是函數(shù)

函數(shù):一般是由事件驅(qū)動的,為了實(shí)現(xiàn)特定功能卧蜓,可以重復(fù)調(diào)用的一段可以執(zhí)行的代碼塊帐要。

二、函數(shù)的分類

從定義角度分:內(nèi)置函數(shù)弥奸、用戶自定義函數(shù)

內(nèi)置函數(shù):字符串榨惠,數(shù)學(xué)函數(shù),數(shù)組函數(shù),js 系統(tǒng)給我們提供的函數(shù)

自定義函數(shù):自己定義的函數(shù):函數(shù)的聲明

從參數(shù)的角度分:有參函數(shù)赠橙、無參函數(shù)

從返回值的角度分:有返回值函數(shù)伸蚯、無返回值函數(shù)

(1)無參無返回值函數(shù)的定義與調(diào)用:

function 函數(shù)名稱(){

? ? 函數(shù)體;

}

函數(shù)名()

(2) 有參無返回值函數(shù):

function 函數(shù)名稱(形參1简烤,形參2剂邮,形參3...){

? ? 函數(shù)體;

}

函數(shù)名稱(實(shí)參1横侦,實(shí)參2挥萌,實(shí)參3...)

1、形參:定義函數(shù)時所用的參數(shù)稱為形參

形參的本質(zhì)是用來接收函數(shù)調(diào)用時傳遞過來的數(shù)據(jù)的存儲空間枉侧;

形參只有在函數(shù)調(diào)用時才開辟空間引瀑,當(dāng)函數(shù)執(zhí)行完畢后,該空間被釋放榨馁。

形參只能在函數(shù)內(nèi)部使用憨栽,因?yàn)樗鼘儆诰植孔兞?/p>

2、實(shí)參:調(diào)用函數(shù)時使用的參數(shù)稱為實(shí)參

實(shí)參的本質(zhì)是函數(shù)要處理的具體的數(shù)據(jù)

一個函數(shù)可以有多個實(shí)參翼虫,用逗號分隔屑柔,形成“實(shí)參列表”

實(shí)參可以是字面量、變量珍剑、表達(dá)式

3掸宛、實(shí)參和形參的關(guān)系

1)函數(shù)被調(diào)用時,實(shí)參會被傳遞給形參招拙,但是形參不能傳遞給實(shí)參唧瘾,即傳遞是單項(xiàng)的;

2)默認(rèn)情況下實(shí)參和形參在數(shù)據(jù)傳遞時是平行傳遞的别凤,即第一個實(shí)參傳遞給第一個形參饰序,第二個實(shí)參傳遞給第二個形參,以此類推规哪;

3)js 中形參的個數(shù)和形參的個數(shù)可以是不一致的求豫,如果實(shí)參 小于 形參,那么沒有介紹的數(shù)據(jù)的形參的值為 undefined由缆;

(3) 有參返回值函數(shù)的定義格式

function 函數(shù)名稱(形參1注祖,形參2...){

? ? 函數(shù)體;

? ? return 返回值

}

var 變量 = 函數(shù)名稱(實(shí)參1均唉,實(shí)參2...)

三是晨、值傳遞和地址傳遞

值傳遞:指將具體數(shù)據(jù)(基本類型的數(shù)據(jù))的副本傳遞給對方,對方在操作這個數(shù)據(jù)時不影響原始數(shù)據(jù)

var arr = [10,20,30,40,50];

function fn(val){

? ? val = 100;

}

fn(arr[0]); //調(diào)用函數(shù) fn 時傳遞的時 arr[0]中數(shù)據(jù)的副本-----值傳遞

console.log(fn(arr[0]));//原數(shù)組不受影響

地址傳遞:指將引用類型的數(shù)據(jù)在對內(nèi)存中的地址傳遞給對方舔箭,對方在操作時罩缴,其實(shí)操作的就是原始數(shù)據(jù)蚊逢,即原有數(shù)據(jù)被影響

var arr = [10,20,30,40,50];

function fn(val){// val 指向了數(shù)組

? ? val[0] = 100;

}

fn(arr); //數(shù)組名稱中保存的是數(shù)組在堆內(nèi)存中的地址--------地址傳遞

console.log(arr);//原數(shù)組中的值變了

四、return 返回值

1箫章、返回值:指函數(shù)被調(diào)用后烙荷,向調(diào)用者返回的一個數(shù)據(jù),函數(shù)內(nèi)部利用 return 關(guān)鍵字將返回值返回

2檬寂、return 關(guān)鍵字的使用格式: return 返回值终抽;

3、return 使用時的注意事項(xiàng):

1)返回值可以是變量桶至,字面量昼伴,表達(dá)式

2)函數(shù)內(nèi)部可以有多個 return, 但是只能執(zhí)行一個镣屹,return 關(guān)鍵字除了返回數(shù)據(jù)圃郊,還具有結(jié)束函數(shù)執(zhí)行的功能

3)如果函數(shù)中沒有設(shè)置 return ,那么在調(diào)用函數(shù)時女蜈,其實(shí)后臺會向調(diào)用者返回一個值 ---- undefined

4)在定義函數(shù)時持舆,return 和它后面的返回值不要換行,因?yàn)閾Q行后伪窖,后臺會認(rèn)為 return 后面沒有返回值逸寓。

5)如果要將 return 用左結(jié)束函數(shù)的功能,那么可以采用 return 的格式惰许;

五席覆、定義函數(shù)的方式

1、函數(shù)聲明的方式

function 函數(shù)名稱(){

? ? 函數(shù)體汹买;

}

函數(shù)名稱();

2、函數(shù)表達(dá)式

var 變量名稱 = function(){

? ? 函數(shù)體聊倔;

}晦毙;

?

var fn = function(){

? ? for (var i = 1; i <= 10; i ++){

? ? ? ? if ( i % 2 == 0 ){

? ? ? ? ? ? console.log(i)

? ? ? ? }

? ? }

};

fn();

1)函數(shù)表達(dá)式方式創(chuàng)建的函數(shù)是沒有名稱的函數(shù)

2)變量中存儲的是對函數(shù)的引用

3)函數(shù)聲明方式和函數(shù)表達(dá)式方式的區(qū)別,函數(shù)聲明方式定義的函數(shù)可以在定義之前調(diào)用該函數(shù)耙蔑,但是函數(shù)表達(dá)式方式定義的函數(shù)见妒,不可以在定義之前調(diào)用。因?yàn)楹瘮?shù)聲明方式定義的函數(shù)有函數(shù)聲明提升操作甸陌,而函數(shù)表達(dá)式方式定義的操作沒有函數(shù)聲明提升操作须揣,只有變量聲明提升操作

3、利用 function 構(gòu)造方法創(chuàng)建函數(shù)

var 變量名稱 = new function('參數(shù)1'钱豁,'參數(shù)2'...);

調(diào)用方式:

變量名稱(實(shí)參1 耻卡, 實(shí)參2, 實(shí)參3...);

構(gòu)造方法 function 中的參數(shù)可以有多個牲尺,那么前面的參數(shù)表示函數(shù)的形參卵酪,最后一個參數(shù)表示函數(shù)體幌蚊。

注意: 這種方式定義的函數(shù)也不可以在定義之前調(diào)用,因?yàn)樗仓挥凶兞柯暶魈嵘僮?/p>

var add = new? function('num1','num2','num3','var sum = num1+ num2 + num3; console.log(sum);');

add(1,2,3);

六溃卡、 變量的分類:全局變量溢豆、局部變量

全局變量:定義在函數(shù)外部的變量被稱為全局變量;

局部變量:定義在函數(shù)內(nèi)部的變量被稱為局部變量瘸羡。

區(qū)別: 1漩仙、全局變量可以在整個文檔中使用

2、局部變量只能在定義它的函數(shù)內(nèi)部使用

3犹赖、函數(shù)內(nèi)部的形參也是局部變量队他,也只能在函數(shù)內(nèi)部使用

4、如果全局變量和局部變量同名冷尉,那么全局變量會被屏蔽

5漱挎、如果局部變量和全局變量同名,那么要使用全局變量雀哨,可以在變量名稱前面加 window. 或者 this.? 磕谅,因?yàn)槿肿兞渴墙o window 對象綁定的屬性

七、 arguments 對象

1雾棺、arguments:該對象是函數(shù)內(nèi)部的一個對象膊夹,即該對象只能在函數(shù)內(nèi)部使用,不可以在外面使用捌浩。它的作用是用來管理函數(shù)被調(diào)用時傳遞過來的實(shí)參(數(shù)據(jù))放刨,它不是一個數(shù)組,它是一個偽數(shù)組尸饺,在管理實(shí)參時也是用下標(biāo)的方式對實(shí)參進(jìn)行了編號进统,即可以使用 arguments[下標(biāo)]的形式操作實(shí)參。

2浪听、形參 和 arguments 的關(guān)系: 形參和 arguments 都可以管理實(shí)參螟碎,而且他們管理的是同一份數(shù)據(jù)。在操作實(shí)參時迹栓,可以使用形參掉分,也可以用 arguments , 為了方便通常使用形參克伊。

在定義函數(shù)時酥郭,到底需不需要定義形參?

--- 如果實(shí)參的個數(shù)是確定的愿吹,那么我們就定義形參不从,如果實(shí)參的個數(shù)是不確定的時候就不定義形參,用 arguments 操作

3洗搂、arguments 對象包含兩個屬性: length消返、callee

1)length 屬性: 獲取實(shí)參個數(shù)载弄;

2)callee 屬性: 該屬性的作用是用來獲取 arguments 對象所在的函數(shù),即callee 屬性指向了 arguments 對象所在的函數(shù)撵颊,常與遞歸函數(shù)結(jié)合使用宇攻,或與匿名自執(zhí)行函數(shù)結(jié)合使用。

--- 如果要判斷一個元素是否為數(shù)組倡勇, 那么可以使用 Array.siArray 方法

1逞刷、 格式: Array.isArray(數(shù)據(jù));

2妻熊、返回值: true(是數(shù)組) 夸浅、 false(不是數(shù)組)

var arr = [1,2,3];

var res = Array.isArray(res);

console.log(res);

八、JavaScript 中沒有重載函數(shù)

重載函數(shù):所謂重載函數(shù)就是指扔役,兩個函數(shù)的名稱相同帆喇,但是他們形參的個數(shù)不同,或者形參的類型不同亿胸,那么我們把這兩個函數(shù)互稱為重載函數(shù)

function fn(a,b){

?

}

function fn(a,b,c){

?

}

//這兩個互稱為重載函數(shù)

// 注意: JavaScript 中沒有重載函數(shù)坯钦,在JavaScript 中,如果函數(shù)名稱相同侈玄,那么后面的函數(shù)會覆蓋前面的函數(shù)

利用 arguments 對象模擬重載函數(shù)

function fn(){

? ? if(arguments.length == 1){

? ? ? ? console.log('只有一個形參' +i);

? ? } else if(arguments.length == 2){

? ? ? ? console.log('有兩個形參' + i)

? ? }

}

fn();

九婉刀、遞歸函數(shù):

遞歸函數(shù):所謂遞歸函數(shù)就是指在一個函數(shù)內(nèi)部調(diào)用了自己的函數(shù)被稱為遞歸函數(shù)。

function fn(){

? ? fn();

}

fn();

注意:在使用遞歸函數(shù)時序仙,一定要確定遞歸函數(shù)的“出口”突颊,即在某個時刻能夠讓函數(shù)不再調(diào)用自己,如果遞歸函數(shù)沒有出口潘悼,那么會出問題律秃。

function fn(n){

? ? if(n == 1){

? ? ? ? return 1;

? ? }

? ? return arguments.callee(n - 1) +n;//推薦遞歸函數(shù)內(nèi)部使用 arguments.callee 屬性來引用當(dāng)前函數(shù)

}

十 、匿名函數(shù)

概念: 沒有函數(shù)名稱的函數(shù)治唤;匿名函數(shù)可以和事件相結(jié)合友绝,常用格式如下:

html 元素 . on事件名稱 = function(){

};

十一 、 回調(diào)函數(shù)

概念: 如果一個函數(shù)被當(dāng)作另外一個函數(shù)的參數(shù)肝劲,那么這個被作為參數(shù)的函數(shù)就是回調(diào)函數(shù),回調(diào)函數(shù)常用匿名函數(shù)郭宝;

var arr = [1,2,3,4,5];

var res = sort(function(a,b){

? ? return a -b;

})

console.log(res);

十二辞槐、 匿名自執(zhí)行函數(shù)

概念: 沒有名稱,且不需要手動調(diào)用的函數(shù)粘室,

格式:

1榄檬、無參五返回值的匿名自執(zhí)行函數(shù)

(function(){

? ? 函數(shù)體;

})();

2衔统、有參無返回值的匿名自執(zhí)行函數(shù)

(function(形參1鹿榜、形參2海雪、形參3...){

? ? 函數(shù)體

})(實(shí)參1、實(shí)參2舱殿、實(shí)參3...)

3奥裸、有參有返回值的自執(zhí)行函數(shù)

var 變量名稱 = (function(形參1、形參2...){

? ? 函數(shù)體沪袭;

? ? return 返回值湾宙;

})(實(shí)參1、實(shí)參2...)

注意:匿名自執(zhí)行函數(shù)冈绊,通常用來創(chuàng)建塊級作用域侠鳄。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市死宣,隨后出現(xiàn)的幾起案子伟恶,更是在濱河造成了極大的恐慌,老刑警劉巖毅该,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件博秫,死亡現(xiàn)場離奇詭異,居然都是意外死亡鹃骂,警方通過查閱死者的電腦和手機(jī)台盯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畏线,“玉大人静盅,你說我怎么就攤上這事∏夼梗” “怎么了蒿叠?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蚣常。 經(jīng)常有香客問我市咽,道長,這世上最難降的妖魔是什么抵蚊? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任施绎,我火速辦了婚禮,結(jié)果婚禮上贞绳,老公的妹妹穿的比我還像新娘谷醉。我一直安慰自己,他們只是感情好冈闭,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布俱尼。 她就那樣靜靜地躺著,像睡著了一般萎攒。 火紅的嫁衣襯著肌膚如雪遇八。 梳的紋絲不亂的頭發(fā)上矛绘,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天,我揣著相機(jī)與錄音刃永,去河邊找鬼货矮。 笑死,一個胖子當(dāng)著我的面吹牛揽碘,可吹牛的內(nèi)容都是我干的次屠。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼雳刺,長吁一口氣:“原來是場噩夢啊……” “哼劫灶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掖桦,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤本昏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后枪汪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涌穆,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年雀久,在試婚紗的時候發(fā)現(xiàn)自己被綠了宿稀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,711評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡赖捌,死狀恐怖祝沸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情越庇,我是刑警寧澤罩锐,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站卤唉,受9級特大地震影響涩惑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桑驱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一竭恬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧熬的,春花似錦萍聊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽此衅。三九已至强戴,卻和暖如春亭螟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背骑歹。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工预烙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人道媚。 一個月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓扁掸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親最域。 傳聞我的和親對象是個殘疾皇子谴分,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評論 2 350

推薦閱讀更多精彩內(nèi)容