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]);