#第8章 函數
- <a href="#no1">8.1 函數定義</a>
- <a href="#no2">8.2 函數調用</a>
- <a href="#no3">8.3 函數的實參和形參</a>
- <a href="#no4">8.4 作為值的函數</a>
- <a href="#no5">8.5 作為命名空間的函數</a>
- <a href="#no6">8.6 閉包</a>
- <a href="#no7">8.7 函數屬性、方法和構造函數</a>
- <a href="#no8">8.8 函數式編程</a>
> 函數是這樣的一段JS代碼,它只定義一次,但可能被執行或調用任意次。
##<a name="no1">8.1 函數定義</a>
> 函數使用`function`關鍵字來定義。它可以用在函數定義表達式或者函數聲明語句里。在兩種形式中,函數定義都從`function`關鍵字開始,其后跟隨這些組成部分:
1. 函數名稱標識符。
2. 一對圓括號。
3. 一對花括號。
###嵌套函數
> 在JS中,函數可以嵌套在其他函數里。
function x(a,b){
function y(c){return c * c;}
return Math.sqrt(y(a) + y(b));
}
##<a name="no2">8.2 函數調用</a>
> 構成函數主體的JS代碼在定義之時并不會執行,只有調用該函數時,它們才會執行。有4中方式來調用JS函數。
1. 作為函數
2. 作為方法
3. 作為構造函數
4. 通過它們的`call()`和`apply()`方法間接調用
###8.2.1 函數調用
> 對于普通的函數調用,函數的返回值成調用表達式的值。如果該函數返回時因為解釋器達到結尾,返回值就是`undefined`。
###8.2.2 方法調用
> 一個方法無非是保存在一個對象的屬性里的JS函數。
**方法鏈:當方法的返回值是一個對象,這個對象還可以再調用的它的方法。**
###8.2.3 構造函數調用
> 如果函數或者方法調用之前帶有關鍵字`new`,它就構成構造函數調用。
var o = new Object();
var o = new Objecy;
###8.2.4 間接調用
> JS中`call()`和`apply()`可以用來間接的調用函數。
##<a name="no3">8.3 函數的實參和形參</a>
###8.3.1 可選形參
> 當調用函數的時候傳入的實參比函數聲明時指定的形參個數要少,剩下的形參都將設置為`undefined`值。因此在調用函數時形參是否可選以及是否可以省略應當保持較好的適應性。
###8.3.2 可變長的實參列表:實參對象
**`arguments`**
**callee和caller屬性:**在非嚴格模式下,`callee`屬性指代當前正在執行的函數。`caller`是非標準的,它指代調用當前正在執行的函數的函數。
###8.3.3 將對象屬性用作實參
> 略
###8.3.4 實參類型
> 略
##<a name="no4">8.4 作為值的函數</a>
> 函數可以定義,也可以調用,這是函數最重要的特性。在JS中,函數不僅是一種語法,也是值,也就是說,可以將函數賦值給變量,存儲在對象的屬性或數組的元素中,作為參數傳入另外一個函數等。
**自定義函數屬性**
> 略
##<a name="no5">8.5 作為命名空間的函數</a>
> 在函數中聲明的變量在整個函數體內都是可見的,在函數的外部是不可見的。不在任何函數內聲明的變量是全局變量,在正整個JS程序中都是可見的。
##<a name="no6">8.6 閉包</a>
> 函數對象可以通過作用域鏈相互關聯起來,函數體內部的變量都可以保存在函數作用域內,這種特性在計算器科學文獻中稱為“閉包”。
##<a name="no7">8.7 函數屬性、方法和構造函數</a>
###8.7.1 length屬性
> 略
###8.7.2 prototype屬性
> 每一個函數都包含一個`prototype`屬性,這個屬性是指向一個對象的引用,這個對象稱做“原型對象”。每一個函數都包含不同的原型對象。當將函數用做構造函數的時候,新創建的對象會從原型對象上繼承屬性。
###8.7.3 call()方法和apple()方法
> 我們可以將`call()`和`apple()`看做是某個對象的方法,通過調用方法的形式來間接調用函數。
###8.7.4 bind()方法
> 略
###8.7.5 toString()方法
> 和所有的JS對象一樣,函數也有`toString()`方法,ECMAScript規范規定這個方法返回一個字符串,這個字符串和函數聲明語句的語法相關。
###8.7.6 Function()構造函數
> `Function()`構造函數可以傳入任意數量的字符串實參,最后一個實參所表示的文本就是函數體;它可以包含任意的JS語句,每兩條語句之間用分號分隔。傳入構造函數的其他所有的實參字符串是指定函數的形參名字的字符串。如果定義的函數不包含任意參數,只須給構造函數簡單的傳入一個字符串——函數體即可。
###8.7.7 可調用的對象
> 略
##<a name="no8">8.8 函數式編程</a>
###8.8.1 使用函數處理數組
> 略
###8.8.2 高階函數
> 所謂高階函數就是操作函數的函數,它接收一個或多個函數作為參數,并返回一個新函數。
###8.8.3 不完全函數
> 略
###8.8.4 記憶
> 略