1.作为数据的函数
函数最重要的特性就是他们能够被定义和调用。在js中,函数并不只是一种语法,还可以是数据,这意味着能够把函数赋给变量、
存储在对象的属性中或者存储在数组的元素中、传递给函数,等等。
function square(x){return x*x;}
在这里,我们定义创建了一个新的函数对象,并且把这个对象赋给了变量square。实际上,这个函数名没有什么实际的意义,
只不过是用来保存函数的变量的名字。将这个函数赋给其他的变量仍会起到相同的作用。
var a = square()4;//a存放数字16
除了赋给全局变量外,还可以赋给对象的属性,在这种情况下,我么称函数为方法。
var o = new Object; o.square = new Function("x","return x*x"); y = o.square(16);
函数可以没有函数名,就像我们将函数赋给数组元素那样:var a = new Array(3); a[0] = function(x){return x*x;} //注意函数直接量
下面是一个更加详细的例子:
/*将函数作为数据的用法*/ function add(x,y){return x+y;} function subtract(x,y){return x-y;} function multiply(x,y){return x*y;} function divide(x,y){return x/y;} //以下的函数可以将上面的某个函数作为参数 //它的两个参数是两个运算符 function operate(operator, operand1, operand2){rerturn operator(operand1, operand2);} //我们可以调用该函数来计算值(2+3)+(4*5) var i = operate(add, operate(add, 2, 3), operate(multiply, 4, 5)); //考虑到本咧的需要,我们再次实现了这个函数,此次使用的函数直接量 //我们吧这些函数存放在一个关联数组中
var operators = new Object(); operators["add"] = function(x,y) {return x+y;} operators["add"] = function(x,y) {return x+y;}
operators["multiply"] = function(x,y) {return x*y;} operators["divide"] = function(x,y) {return x-y;} operators["pow"] = Math.pow;//也用于预定义函数 //一下的函数将运算符名作为参数,在数组中检索这个运算符 //然后对运算符调用检索到的函数 //注意调用这个运算符函数的语法 function operate2 (op_name, operand1, operand2){ if(operators[op_name] == null) retunrn "unknown operator"; else return operators[op_name](operand1, operand2);} //我们可以采用如下方式调用该函数值("hello"+"world") var j = operate2("add", "helllo", operate2("add"," ", "world")) //使用预定义的Math.pow()函数 var k = operate2("pow", 10, 2)
2.函数的实际参数:Arguments对象
在一个函数体内,标识符arguments具有特殊含义。它是调用对象的一个特殊属性,用来引用Arguments对象。Arguments
对象就像数组,可以按照数字获取传递给函数的参数值。但它并非真正的Array对象。Arguments对象也定义了callee属性。
尽管定义JS函数时有固定数目的命名参数,但当调用这个函数时,传递给它的参数数目却可以是任意的。数组Arguments[]
允许完全地存取那些实际参数值,即使某些参数还没有被命名。假设你定义了一个函数f,要传递给它一个实际参数X,如果你用两个
实际参数来调用这个函数,那么在函数体内,用形式参数名x或Arguments[0]可以存取第一个实际参数。而第二个实际参数只能通过
Arguments[1]来存取。而且和所有的数组一样,Arguments具有length属性,用于说明它含有的元素个数。因此,在函数f的主体内,
如果调用时使用的是两个实际参数,那么Arguments.length的值就是2。
数组Arguments【】可以用于多个方面。下面的例子说明了使用它来检测调用函数时是否使用了正确数目的实际参数,因为JS
不会替你来做这项检测:
数组arguments[] 还为JS函数开发了一项重要的可能性,既可以编写函数使之能够使用任意数目的实际参数,然后返回其中最大的function f(x, y, z){ //首先检查传递的参数数量是否正确 if(arguments.length != 3){ throw new error("function f called with " + arguments.length + "arguments, but it expects 3 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;} var largest = max{1,10,100,2,3,1000,4,5,10000,6};