javascript 基础之函数
通过精读《javascript权威指南》函数章节,对javascript的函数特点做一下总结,有些内容来至网络,摘自书中,还掺杂了自己的一些理解,不一定很透彻,如有纰漏望指正。
1. 可选参数
javascript是弱类型语言,并且在调用函数时不会对函数的个数进行检查,只需要函数名匹配,则会调用函数,未传入的参数值为undefined
function testArguments(arg1, arg2, arg3) {
alert(arg1 + " " + arg2 + " " + arg3);
}
testArguments(1, 2);2. 可变长度参数列表:arguments对象
2.1 javascript函数可以在定义的时候不定义参数,通过内置对象arguments取得
function max(/* ... */) {
var m = Number.NEGATIVE_INFINITY;
//遍历所有的参数并且记录下最大值返回
for(var i = 0; i < arguments.length; i++) {
if(arguments[i] > m) {
m = arguments[i];
}
}
return m;
}
alert("取出最大参数中的最大值: " + max(1, 2, 4, 3));2.2 arguments的length属性和Function的length属性
arguments.length表示实际传入函数的参数个数,Function的length表示当前函数定义的参数个数
sample-2.2-01
function testArgsLength(x, y, z) {
alert("arguments.length=" + arguments.length);
alert("testArgsLength.arguments.length=" + testArgsLength.arguments.length);
alert("testArgsLength.length=" + testArgsLength.length);
alert("arguments.callee.length=" + arguments.callee.length);
}
testArgsLength(1, 2);结果为:
arguments.length=2 testArgsLength.arguments.length=2 testArgsLength.length=3 arguments.callee.length=3
- 这里就可以看出arguments.length和Function.length的区别,并且发现function内置对象arguments其实也是可以通过function.argument访问,也就是说其实argument和length都是Function这个类的属性,只是arguments对象进行内置的处理,可以直接在函数内部以arguments内置变量访问。
- aguments.callee表示当前调用函数,在此例中和函数名testArgsLength效果一样。
- 这里可以发现javascript中function是有属性的,也就是说function其实也是一个对象实例,这就和java的函数有了很大的区别。
sample-2.2-02
//***************************************
//arguments属性length
function check(args) {
var actual = args.length;
var expected = args.callee.length;
if(actual != expected) {
throw new Error("Wrong number of arguments : expected:" + expected + "; actually passed " + actual);
}
}
function f5(x, y, z) {
check(arguments);
return x + y + z;
}
alert("1+3+4累加结果:" + f5(1, 3, 4));
alert("1+3+4+5累加结果:" + f5(1, 3, 4, 5));3. 函数直接量和作为数据的函数
3.1 函数直接量是一个表达式,它可以定义匿名函数。函数直接量的语法和function语句非常相似,只不过它被用作表达式,而不是用作语句,而且也无需指定函数名。
下面的三行代码分别使用function()语句,Function()构造函数和函数直接量定义了三个基本相同的函数。
sample-3.1-01
function f1(x){return x*x}; //function()语句
var f2 = new Function("x","return x*x;"); //Function构造函数
var f3 = function(x){return x*x}; //函数直接量
虽然函数直接量的创建是使用匿名函数,但是它的语法也规定它可以使用函数名,这在编写调用自身的递归函数时非常有用。
sample-3.1-02
//***************************************
//函数直接量
var f = function fact(x) {
if(x <= 1) {
return 1;
} else {
return x * fact(x - 1);
}
};
alert("3的阶乘: " + f(3));
//<<权威指南>>说这里不会成功,但是在IE8成功了,疑惑,未深究。
alert("调用fact:" + fact(3));3.2 函数最重要的特征是他们能够被定义和调用,函数的定义和调用是javascript和大多数程序设计语言的语法特性。但是在Javascript中,函数并不是只是一种语法,还可以是数据,定义函数的过程实际是创建Function这个内置类对象的过程,所以javascript中可以把函数赋值给变量,存储在对象属性中或者存储在数组的元素中,作为参数传递给函数,等等。
sample-3.2-01
function square(x) {
return x*x;
}
var a = square(4);
var b = square; //将函数赋值给变量b
var c = b(5);
alert("c=" + c);
var o = new Object();
o.square = function(x) {
return x*x;
}; //将函数赋值给对象属性
y = o.square(16);
alert("y=" + y);
var a = new Array(3);
a[0] = function(x) {
return x*x;
}; //将函数赋值给数组元素
a[1] = 20;
a[2] = a[0](a[1]);
alert("a[2]=" + a[2]);