it之路。

javascript 学习之 函数-数据函数

函数最重要的特点是他们可以被定义和调用。这也是javascript以及其它所有编程语言的语法规则。但是在javascript中,函数不仅仅是语法规则,还可以是数据,这就意味着他们可以被分配给变量,存储在对象的属性或者数组元素中,传给某个函数的参数中,等等。

为了理解函数怎样像javascript数据一样工作,考虑一下这个定义:

function square(x) {return x*x;}

这个定义创建了一个新的函数对象并且将它分配给变量square。函数名并不重要;它只是指向这个函数的变量名。函数可以被分配给另一个变量:

var a=square(4); //a包含数字16

var b=square;    // 现在b也指向了square指向的函数

var c=b(5);        // c就是25

函数也可以被分配给对象的属性,这个时候,我们叫他方法:

var o=new Object;

o.square=function(x){return x*x;} // 似曾相似的 function literal

y=o.square(16);y就等于256

当把函数分配给数组元素时,就不需要名字了:

var a=new Array(3);

a[0]=function(x) {return x*x;}

a[1]=20;

a[2]=a[0](a[1]);// a[2]就是400

最后一行的函数调用看起来有些怪异,但更怪异的是在javascript中他是合法的!

下面的代码展示了当函数被作为数据的时候能做的事的一个清单,它展示了函数怎样被作为参数传给另一个函数,下面的例子可能有一点复杂,但是注释很清楚,好好看:

// 在这里 我们定义一些简单的函数

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)

{

    return operator(operand1,operand2);

}

// 我们可以像这样调用这个函数来计算(2+3)+(4*5)的值:

var i=operate(add,operate(add,2,3),operate(multiply,4,5);

// 为了例子,我们再调用这个函数,这次我们用object literal中的function literal

var operators=

{

    add:function(x,y) {return x+y},

    subtract:function(x,y) {return x-y},

    multiply:function(x,y) {return x*y},

    divide: function(x,y) {return x/y},

    pow:Math.pow

};

// 下面这个函数调用操作符名,在对象中查检操作符,注意调用的语法

function operate2(op_name,operand1,operand2)

{

    if(typeof operators[op_name]=="function")

        return operators[op_name(operand1,operand2);

    else throw "unknown operator";

}

// 我们可以调用这个函数来计算("hello"+" "+"world")的值:

var j=operate2("add","hello",operate2("add"," ","world"));

// 用预定义函数

var k=operate2("pow",10,2);

如果这个例子还没有让你明白将函数作为其它函数的参数和将函数看作数据。不妨想想Array.sort()函数。这个函数对数组元素进行排序。因为有很多种顺序可以排(数字顺序,字母表顺序,日期顺序,正序,倒序,等等)。sort()函数需要用另一个函数来告诉它怎样进行排序,这个函数很简单:选数组中的两个元素相比较,然后返回一个值来指明哪个在前哪个在后。这样的一个函数参数让Array.sort()方法变得极其完美和灵活。他可以对任何数据进行任何你想到的顺序进行排序。

posted @ 2009-04-29 15:03  3912.77  阅读(369)  评论(1编辑  收藏  举报