一鞋喇、什么是函數(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)建塊級作用域侠鳄。