JavaScript权威指南—函数
函数定义
function <函数名>(<参数列表>)
{
<函数体>
}
函数既可以有return语句,也可以没有。如果函数没有return语句,它就只执行函数体中的每条语句,然后返回给调用者undefined。
函数可以嵌套在其它函数中,但是不能出现在循环或条件语句中。(函数直接量例外)
Function构造函数
var <对象名>=new Function(<参数列表>,<函数体>)
函数直接量
var <对象名>=function(<参数列表>)
{
<函数体>
}
使用函数直接量创建的是未命名函数,但是它的语法也规定可以指定函数名,这在编写调用自身的递归函数时非常有用。
使用函数直接量比使用Function构造函数更方便。
创建一个函数对象,实际上函数名并没有什么实质意义,它不过是用来保存函数的变量的名字,或者说是函数的一个引用。
函数可以做为参数传递给其它函数或者把函数作为数值来处理。
函数的实际参数Arguments对象
在一个函数体内,标识符arguments具有特殊含义。它是调用对象的一个特殊的属性,用来引用Arguments对象。Arguments对象就像数组,可以按照数字获取传递给函数的参数值。
Arguments对象还定义了callee属性,用来引用当前正在执行的函数。这对未命名的函数调用自身非常有用。
尽管定义函数时有固定数目的命名参数,但当调用这个函数时,传递给它的参数数据却可以是任意的。
函数实际上是一种对象。
函数的length属性表示函数声明的形参的个数。
每个函数都有prototype属性,它引用的是预定义的原型对象。原型对象在使用new运算符把函数作为构造函数时起作用,它在定义新的对象类型时起着非常重要的作用。
ECMAScript V3给所有函数定义了call()和apply()两个方法。使用这两个方法可以像调用其它对象的方法一样调用函数。call()和apply()的第一个参数都是要调用的函数的对象,在函数体内这一参数是关键字this的值。call()的剩余参数是传递给要调用的函数的值。apply()和call()方法类似,只不过传递给函数的参数是由数组指定的。
例如:
f.call(o,1,2);
相当于下面的代码
o.m = f;
o.m(1,2);
delete o.m;
function <函数名>(<参数列表>)
{
<函数体>
}
函数既可以有return语句,也可以没有。如果函数没有return语句,它就只执行函数体中的每条语句,然后返回给调用者undefined。
函数可以嵌套在其它函数中,但是不能出现在循环或条件语句中。(函数直接量例外)
Function构造函数
var <对象名>=new Function(<参数列表>,<函数体>)
函数直接量
var <对象名>=function(<参数列表>)
{
<函数体>
}
使用函数直接量创建的是未命名函数,但是它的语法也规定可以指定函数名,这在编写调用自身的递归函数时非常有用。
使用函数直接量比使用Function构造函数更方便。
创建一个函数对象,实际上函数名并没有什么实质意义,它不过是用来保存函数的变量的名字,或者说是函数的一个引用。
函数可以做为参数传递给其它函数或者把函数作为数值来处理。
函数的实际参数Arguments对象
在一个函数体内,标识符arguments具有特殊含义。它是调用对象的一个特殊的属性,用来引用Arguments对象。Arguments对象就像数组,可以按照数字获取传递给函数的参数值。
Arguments对象还定义了callee属性,用来引用当前正在执行的函数。这对未命名的函数调用自身非常有用。
尽管定义函数时有固定数目的命名参数,但当调用这个函数时,传递给它的参数数据却可以是任意的。
函数实际上是一种对象。
函数的length属性表示函数声明的形参的个数。
每个函数都有prototype属性,它引用的是预定义的原型对象。原型对象在使用new运算符把函数作为构造函数时起作用,它在定义新的对象类型时起着非常重要的作用。
ECMAScript V3给所有函数定义了call()和apply()两个方法。使用这两个方法可以像调用其它对象的方法一样调用函数。call()和apply()的第一个参数都是要调用的函数的对象,在函数体内这一参数是关键字this的值。call()的剩余参数是传递给要调用的函数的值。apply()和call()方法类似,只不过传递给函数的参数是由数组指定的。
例如:
f.call(o,1,2);
相当于下面的代码
o.m = f;
o.m(1,2);
delete o.m;