Javascript学习笔记(二)Javascript核心之函数
JavaScript中函数声明定义格式:
function fname(param1,param2,…){
statement
}
此外,还可以使用Function()构造函数和new运算符动态地定义函数。
var fname = new Function("param1","param2","…","statement");
Function()构造函数可以接受任意多个字符串参数,最后一个参数是函数体,可以包含任何JavaScript语句,语句之间用分号分隔。
使用Function()构造函数允许我们动态地建立和编译一个函数,而不会将我们限制在function语句预编译的函数体中。这样也会带来负面影响,就是每次调用一个函数时,Function()构造函数就要对它进行编译。(如果在for循环语句中创建,那么语句在执行每次循环都要编译一次)
第三种定义函数的方式是函数直接量。
var fname = function(param1,param2,…){statement}
而且,函数直接量的语法也规定它可以指定函数名,这对于递归函数非常有用:
var f = function fact(x){if(x<=1) return 1; else return x*fact(x-1);}
由于JavaScript是一种无类型语言,所以不能给函数的参数指定类型,JavaScript也不会检测传递的参数的数据类型。而且 JavaScript也不会检测传递的参数的个数是否正确,如果参数比函数需要的个数多,多余的值会被忽略;如果传递的参数比函数需要的个数少,缺少处补 undefined。
同样,由于JavaScript是一种无类型语言,所以无需定义函数的返回值类型,如果在函数体中不包含return语句,将返回undefined。
在JavaScript中,函数的一个重要特性就是可以作为数据来使用。在定义函数时,就定义了一个以函数名为变量名的变量,我们可以将这个变量赋给全局变量和对象的属性。也可作为其它函数的参数传递。
在JavaScript函数体内,可以用arguments标示符来引用Arguments对象,Arguments对象就像数组一样,用于存储或读取函数的参数值。arguments像数组一样具有length属性,用于说明它所包含的元素个数,并可以通过下标的方式(如arguments[0])来访问数据。比如,我们可以用arguments[]来检测调用函数时是否使用了正确的实际参数(JavaScript不会检测)。
function f(x,y,z){
if(arguments.length != 3){
....
}
statements
}
除此之外,我们还能够用arguments来访问函数中使用的任意多的实际参数(相对于函数定义的参数数)。
另外,Arguments对象还定义了callee属性,用来引用当前正在执行的函数。这对未命名的函数调用自身是非常有用的。
function(x){
if(x<=1) return 1;
return x*arguments.callee(x-1);
}
以前我们曾提到,在JavaScript中,函数是一种特殊的对象Function,作为对象,它必定会具有属性和方法。
与arguments数组的length属性不同,Function的length属性明确地说明了一个函数声明的形式参数的个数,而且它在函数体的内部外部都有效(arguments数组的length属性只在函数体内部有效)。Function的length属性可以通过 arguments.callee.length来访问。
当函数需要使用一个在调用过程中都保持不变的值时,我们还可以通过自定义属性来存储这个值。定义的方法是,函数名.属性名=?(fname.name = ?;)。
apply()方法和call()方法