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

   

相关推荐