一、函数的声明方式(3种)
1、普通
function box (num1,num2){
return num1+num2;
}
2、使用变量初始化函数
var box=function(num1,num2){
return num1+num2;
}
3、使用function 构造函数
var box =new Function('num1','num2','return num1+num2');
第三种方式不推荐,会导致解析两次代码,第一次是ECMAScript代码,第二次是解析传入的构造函数中的字符串,会影响性能。但能通过这种语法来理解函数是对象,函数名是指针的概念。
二、函数的内部属性
有2个特殊的对象:arguments、this。
1、arguments
是一个类数组对象,包含着传入函数中的所有参数,主要用途是保存函数参数。
用途:
1、表示函数自身:
对于阶乘函数一般要用到递归算法,所以函数内部一定会调用自身,如果函数名不改变是没有问题的,但一旦改变函数名,内部的自身调用需要逐一修改,为了解决这个问题,可以用arguments.callee来代替
2、this
this引用的是函数据以执行操作的对象,或者说函数调用语句所处的那个作用域。
三、函数属性和方法
每个函数对包含两个属性
1、length
表示函数希望接收的命名参数的个数。
2、prototype
是保存所有实例方法的真正所在,也就是原型。它有两个方法(每个函数都包含,都是在特定的作用域中调用的函数,实际上等于设置函数体内this对象的值。):
1、apply()
2、 call()
与apply()方法相同,区别就是接收参数的方式不同。
2种方法经常用到的地方是扩充运行的作用域,对象冒充:
好处就是不需要与方法发生任何耦合关系,也就是说,box对象和sayColor方法之间不会有多余的关联操作,比如box.sayColor=sayColor;
通过Function函数对象的性质,可以很方便的将一个函数赋值给一个变量或者将一个函数作为参数传递,实现了代码段的重复利用。