1.函數(shù)的定義與調(diào)用
1.初識函數(shù)
在Javascript中,函數(shù)就是對象,其應(yīng)用:
1)被賦值給一個變量
2)被賦值為對象的屬性
3)作為參數(shù)被傳入別的函數(shù)
4)作為函數(shù)的結(jié)果被返回
5)用字面量來創(chuàng)建
2.參數(shù)設(shè)置
1.無參函數(shù):適用于不需要提供任何數(shù)據(jù),即可完成指定功能的情況。
2.有參函數(shù):適用于開發(fā)時函數(shù)體內(nèi)的操作需要用戶傳遞數(shù)據(jù)的情況。
1)形參:形式參數(shù),具有特定的含義,在定義有參函數(shù)時設(shè)置的參數(shù)。
2)實參:實際參數(shù),也就是具體的值,在函數(shù)調(diào)用時傳遞的參數(shù)。
3.獲取函數(shù)調(diào)用時傳遞的所有實參:適用于開發(fā)時函數(shù)體形參不確定的情況。
1)實現(xiàn)方式:利用arguments對象,在函數(shù)體內(nèi)可獲取函數(shù)調(diào)用時傳遞的實參。
2)其他操作:length屬性可獲取實參的總數(shù),具體實參值可利用數(shù)組遍歷方式。
3.函數(shù)的調(diào)用
1.直接調(diào)用:函數(shù)名(實參值)
sayHi("南工院","新學(xué)期開學(xué)了");
2.在表達(dá)式中調(diào)用
這種方式適合有返回值的函數(shù),返回值作為表達(dá)式的一部分參與運算,有時還會和(alert、document)等語句配合輸出。
注意點:
1).return 語句不是函數(shù)必須的,但任何函數(shù)在任何時候都可以通過return語句+ 返回的值,實現(xiàn)返回。
2).若在一個文件中,定義函數(shù)名字相同,會使用最后定義的函數(shù)
2.變量的作用域
1.全局變量:不在任何函數(shù)內(nèi)聲明的變量(顯示定義)或在函數(shù)內(nèi)省略var聲明變量(隱式定義)都稱為全局變量。
作用范圍:它在同一個頁面文件中的所有腳本內(nèi)都可以使用。
2.局部變量:在函數(shù)體內(nèi)利用var關(guān)鍵字定義的變量稱為局部變量,它僅在該函數(shù)體內(nèi)有效。
3.塊級變量:ES6提供的let關(guān)鍵字聲明的變量稱為塊級變量,僅在"{}"中間有效,如if、for或while語句等。
4.垃圾回收機制:
在JavaScript中,局部變量只有在函數(shù)的執(zhí)行過程中存在,而在這個過程中會為局部變量在(棧或堆)內(nèi)存上分配相應(yīng)的空間,以存儲它們的值,然后在函數(shù)中使用這些變量,直到函數(shù)結(jié)束。
一旦函數(shù)執(zhí)行結(jié)束,局部變量就沒有存在必要了,此時JavaScript就會通過垃圾回收機制自動釋放它們所占用的內(nèi)存空間。
3.匿名函數(shù)
概念:匿名函數(shù)指的是沒有函數(shù)名稱的函數(shù)。
作用:可以有效的避免全局變量的污染以及函數(shù)名的沖突問題。
說明:既是函數(shù)表達(dá)式的另一種表示形式,又可通過函數(shù)聲明的方式實現(xiàn)調(diào)用。
① 函數(shù)表達(dá)式中省略函數(shù)名
var fn = function (num1, num2){
return? num1 + num2;
};
fn(1, 2);
② 自調(diào)用方式
(function (num1, num2) {
return? num1 + num2;
})(2, 3);
③ 處理事件
document.body.onclick? = function () {
alert('Hi, everybody!');
}
4.回調(diào)函數(shù)
1.概念:所謂回調(diào)函數(shù)指的就是一個函數(shù)A作為參數(shù)傳遞給一個函數(shù)B,然后在B的函數(shù)體內(nèi)調(diào)用函數(shù)A。此時,我們稱函數(shù)A為回調(diào)函數(shù)。
2.提示:匿名函數(shù)常用作函數(shù)的參數(shù)傳遞,實現(xiàn)回調(diào)函數(shù)。
3.應(yīng)用:函數(shù)體中某部分功能由調(diào)用者決定,此時可以使用回調(diào)函數(shù)。
4.在JavaScript中還為數(shù)組提供了很多利用回調(diào)函數(shù)實現(xiàn)具體功能的方法。

function cal(num1,num2,fn) {
return fn(num1,num2)
}
console.log(cal(45,55,function (a,b) {
return a+b
}))
console.log(cal(10,20,function (a,b) {
return a*b
}))
var arr=[[1,2,3],[4,5,6],[7,8,9]]
var reverse=arr[1].map(function (col,i) {
return arr.map(function (row) {
return row[i];
??? })
})
console.log(reverse)
5.嵌套與遞歸
1.嵌套函數(shù)
概念:在一個函數(shù)內(nèi)部存在另一個函數(shù)的聲明。
特點:內(nèi)層函數(shù)只能在外層函數(shù)作用域內(nèi)執(zhí)行,在內(nèi)層函數(shù)執(zhí)行的過程中,若需要引入某個變量,首先會在當(dāng)前作用域中尋找,若未找到,則繼續(xù)向上一層級的作用域中尋找,直到全局作用域,我們稱這種鏈?zhǔn)降牟樵冴P(guān)系為作用域鏈。
variBaseNum= 10;
function addNum(iNum1, iNum2) {
function doAdd() {
return iNum1 + iNum2 + iBaseNum;
}
?return doAdd();
}
2.遞歸調(diào)用
概念:遞歸調(diào)用是函數(shù)嵌套調(diào)用中一種特殊的調(diào)用。它指的是一個函數(shù)在其函數(shù)體內(nèi)調(diào)用自身的過程,這種函數(shù)稱為遞歸函數(shù)。
6.閉包函數(shù)
1.在JavaScript中,內(nèi)嵌函數(shù)可以訪問定義在外層函數(shù)中的所有變量和函數(shù),并包括其外層函數(shù)能訪問的所有變量和函數(shù)。但是在函數(shù)外部則不能訪問函數(shù)的內(nèi)部變量和嵌套函數(shù)。此時就可以使用"閉包"來實現(xiàn)。
2.所謂"閉包"指的就是有權(quán)訪問另一函數(shù)作用域內(nèi)變量(局部變量)的函數(shù)。它最主要的用途是以下兩點:
1)可以在函數(shù)外部讀取函數(shù)內(nèi)部的變量。
2)可以讓變量的值始終保持在內(nèi)存中。
<script>
function fn() {
var times=0
var c=function () {
return ++times
}
return c
??? }
var count=fn();
console.log(count())
console.log(count())
console.log(count())
console.log(count())
console.log(count())
</script>