#第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 记忆
> 略