函數:封裝一項專門任務步驟的代碼段,然後起一個名字;
when:當一項任務需要反複執行時,又不希望重複編寫;
代碼重用!!!
how:聲明 定義 調用
聲明并定義一個函數
function 函數名([參數變量清單]){
函數體:任務步驟
[return 傳回值]
}
調用函數執行:在任何位置:函數名([參數變量清單]);
注: 函數隻有在調用的時候才會執行
反複調用就會反複執行相同代碼
why:代碼重用!!!
一處定義,反複使用
一次修改,處處生效
函數參數:專門用來接收傳入函數内資料的變量
when:當函數必須某些資料才可以正常執行時
參數可以讓方法變得更加靈活
how:function 函數名(變量1,變量2….變量n)
如何傳遞參數值:調用時:函數名(值1,值2,….值n)
注:一般情況下值的個數和順序,應與聲明時參數清單一緻
傳回值:方法調用後傳回的執行結果 –>一個資料
如何傳回資料:在函數體中 return 傳回值;
1、return單獨使用表示退出函數執行的意思
2、函數僅負責傳回資料,不負責儲存資料
如何獲得傳回值:var 變量 = 函數名()
變量作用域:一個變量可用範圍
1、全局作用域:變量可以在程式的任何位置被通路;
2、局部作用域:變量僅能在函數調用時,函數被通路;
1、全局變量:定義在全局作用域中的變量
2、局部變量:定義在函數作用域中的變量1、 直接在函數外部聲明的變量
全局變量都屬于window對象–全局對象:相對于變量而言就是儲存多個資料
2、無論在任何位置,為從未聲明過的變量指派時
自動在全局建立同名全局變量
1、函數内部定義或聲明的變量
2、參數變量天生就是局部變量
函數定義和調用:
1、聲明和定義函數時:
在window中建立函數名變量
在window外建立函數定義的對象–>封裝函數的定義
函數名變量儲存了指向函數對象的位址
2、調用時,建立局部變量
3、在調用過程中:
如果局部有,不用全局
如果局部沒有,用全局
如果局部全局都沒有,報錯
4、調用結束,釋放所有局部變量
聲明提前:在函數被調用之前或程式執行之前
将var聲明的變量和function聲明的函數
提前到目前作用域的頂部集中建立
指派留在原地
函數按值傳遞:js無論變量間指派或使用變量傳遞參數時,都是将變量中的值複制一個副本給對方
全局函數:isNaN parseInt parseFloat
alert prompt不是全局函數 (BOM)
函數遞歸:函數自己調用自己
1、**函數對象
2、**重載overload
3、*記憶體中的Function對象
4、**匿名函數
5、*****閉包
1、Function對象:js中一切都是對象
函數名其實就是引用函數定義對象的變量
1、arguments對象:
重載:程式中同時定義多個相同函數名不同參數清單的函數;
調用時調用者不必區分每個函數的參數;
執行時,動态選擇比對的函數執行;
注:不是技術隻是一個現象、概念
js文法不支援重載,但可通過arguments對象模拟出重載
arguments對象:函數對象内,自動建立專門接受所有參數值的類數組對象
when:不同參數,不同操作,但是操作名稱相同;
why:減輕調用者調用者調用時選擇的負擔
arguments[i]:擷取下标為i的參數值
.length 可以獲得參數值的個數
注:即使定義了參數變量,argunments對象同樣可以修改參數值,同樣會受到所有參數個數
2、函數對象:
建立函數對象:3種
1、聲明方式建立:
function 函數名(參數清單){函數體;return 值};
函數名和函數定義都會被提前;
在調用前後定義都可以
2、函數直接量建立:
var 函數名 = function(參數清單){函數體;return 值};
僅函數聲明提前
函數定義保留在本地
必須在定義後調用
3、使用new建立函數類型的對象
var 函數名 = new Function(“參數”,”參數2”…”函數體”);
3、記憶體中函數對象:
記憶體同時建立了兩個對象:
函數對象:函數定義
作用域鍊對象:儲存了函數對象可用的變量位置的對象
調用函數時:又會建立一個新的對象
活動對象:專門儲存局部變量的對象
在作用域鍊對象中追加指向活動對象的引用
調用結束後:作用鍊中活動對象引用出棧
活動對象因為無人調用而釋放
4、匿名函數:定義時不指定函數的名字的函數
when:2種
1、匿名函數自調用 (IIFE)
定義完成立刻執行,執行完畢立刻釋放
(function(a){
})(a)
2、匿名函數回調:将函數作為對象傳遞給其他函數
什麼時候使用,有另一個函數決定
優點:節省記憶體空間
缺點:無法反複使用
5、閉包:包括不必計算的變量的函數,函數可以使用函數外定義的變量
犀牛書:函數變量可以被隐藏于作用域鍊中,看起來是函數将變量包裹起來
函數套函數
閉包:提升變量生存周期,即可長久儲存,又不會被全局污染
如何建立閉包:
1、定義外層函數,用來封裝一個受保護的局部變量;
2、定義内層函數,執行對外層函數局部變量的操作
3、外層函數傳回内層函數對象,并且外層函數被調用,結果儲存在全局變量中
三個特點:
1、函數嵌套;
2、内層函數使用外層函數的局部變量
3、内層函數被傳回到外部,在外部調用
when:反複使用局部變量,又避免全局污染