天天看點

函數概述-對象-重載-匿名函數-閉包

函數:封裝一項專門任務步驟的代碼段,然後起一個名字;

when:當一項任務需要反複執行時,又不希望重複編寫;

代碼重用!!!

how:聲明 定義 調用

聲明并定義一個函數

function 函數名([參數變量清單]){

函數體:任務步驟

[return 傳回值]

}

調用函數執行:在任何位置:函數名([參數變量清單]);

注: 函數隻有在調用的時候才會執行

反複調用就會反複執行相同代碼

why:代碼重用!!!

一處定義,反複使用

一次修改,處處生效

函數參數:專門用來接收傳入函數内資料的變量

when:當函數必須某些資料才可以正常執行時

參數可以讓方法變得更加靈活

how:function 函數名(變量1,變量2….變量n)

如何傳遞參數值:調用時:函數名(值1,值2,….值n)

注:一般情況下值的個數和順序,應與聲明時參數清單一緻

傳回值:方法調用後傳回的執行結果 –>一個資料

如何傳回資料:在函數體中 return 傳回值;

1、return單獨使用表示退出函數執行的意思

2、函數僅負責傳回資料,不負責儲存資料

如何獲得傳回值:var 變量 = 函數名()

變量作用域:一個變量可用範圍

1、全局作用域:變量可以在程式的任何位置被通路;

2、局部作用域:變量僅能在函數調用時,函數被通路;

1、全局變量:定義在全局作用域中的變量

1、 直接在函數外部聲明的變量

全局變量都屬于window對象–全局對象:相對于變量而言就是儲存多個資料

2、無論在任何位置,為從未聲明過的變量指派時

自動在全局建立同名全局變量

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:反複使用局部變量,又避免全局污染

繼續閱讀