Function 类型

js 的函数实际上是对象,每个 函数都是 Function 类型的实例,而且与其它引用类型

一样,有属性和方法。由于函数是对象,因此函数名实际上也是指向函数对象的指针

,不会与某个函数绑定.

基本定义函数方法
function sum(num1, num2)
{
    alert(num1+num2);
}    

调用 sum(1,2); // 3

用函数表达式定义

    var sum = function(n1, n2){
        alert(n1+n2);
    };
调用
    sum(10, 9); // 19
function 后面没有函数名,用函数表达式定义时,没有必要了,后面有一个分号,像

声明其它变量一样

使用 Function 构造函数(不推荐用)

var sum = new Function("n1", "n2", "return n1+n2");
调用方式:alert(sum(1, 7)); // 8
可以授受任意多个参数,但最后一个始终被当做函数体

由于函数名仅仅是指向函数的指针,所以函数名与包含对象指针的其他变量没有什么

不同,也就是说,一个函数可以有多个名字
例:
function sum(n1, n2)
{
    return n1+n2;
}
alert(sum(10,2)); // 12

var anothersum = sum; // 没有括号,所以不是调用函数,而是访问函数指针
sum = null;
alert(anothersum(10, 89)); // 99

函数声明和表达式:
其实都差不多,只有一点最大的差别,如以下是声明:

    alert(sum(10)); // 100
    function sum(num)
    {
        return 10*num;
    }

以下是表达式,会出错

    alert(sum(10)); // 出错
    var sum = function(num){
        return num * 10;
    }

表达式必须放在调用前,如下是正确的:


    var sum = function(num){
        return num * 10;
    }
    alert(sum(10)); // 100

函数名本身就是变量,所以函数也可以作为值来使用。也就是说,不仅可以像传递参

数一样传递函数给另一个函数,而且可以将一个函数作为另一个函数的结果返回,如



    function functionCallSome(someFunction, arguments)
    {
        return someFunction(arguments);
    }

    var sum = function(num){
        return num * 8;
    };

    alert(functionCallSome(sum, 10)); // 80

从一个函数返回另一个函数,用来改变 sort() 排序方法

    function test(name)
    {
        return function(obj1, obj2)
        {
            var v1 = obj1[name];
            var v2 = obj2[name];
            if(v1 > v2)
            {
                return -1;
            }else if(v1 < v2)
            {
                return 1;
            }else
            {
                return 0;
            }
        }
    }

    var data = [{name:'lin', age: 20}, {name:"long", age:26}];
    data.sort(test("age"));
    alert(data[0].name);

函数内部两个特殊的对象:arguments 和 this    
arguments 是保存函数的参数,这个对象有一个 callee 属性,该属性是一个指针,

指向拥有 arguments 对象的函数
如下的递归
function f(num)
{
    if(num <= 1)
    {
        return 1;
    }else
    {
        return num * f(num - 1);
    }

}
如果函数名不变,没有问题
alert(5); // 120
=================================
function f(num)
{
    if(num <= 1)
    {
        return 1;
    }else
    {
        return num * arguments.callee(num - 1);
    }

}

var ff = f;
f = function ()
{
        return 0;
};

alert(ff(5)); // 120

this与java,也即与 PHP中类似,是函数在执行时所处的作用域

    window.color = "red";
    var o = {color:"blue"};

    function sayColor()
    {
        alert(this.color);
    }
    sayColor(); // red

    o.sayColor = sayColor; // 是指针,指向相同
    o.sayColor(); // blue

每个函数都包含两个非继承的方法 apply()和 call(),用途都是在特定的作用域用调

用函数,实际上等于设置函数体内的 this值, apply()接受两个参数,一个是函数运

行的作用域,一个是参数数组

    function sum(num1, num2)
    {
        return num1 + num2;
    }
    function callSum1(num1, num2)
    {
        return sum.apply(this, arguments); // 传入 arguments
    }

    function callSum2(num1, num2)
    {
        return sum.apply(this, [num1, num2]); // 传入 数组
    }
    alert(callSum1(1, 2)); // 3
    alert(callSum2(10, 3)); // 13

==========================================
call(),方法一样,只不过是第二个参数必须是字符串形式的参数

    function sum(num1, num2)
    {
        return num1 + num2;
    }


    function callSum2(num1, num2)
    {
        return sum.call(this, num1, num2); // 传入 参数
    }
    alert(callSum2(10, 3)); // 13

======================
call()/apply()还可以扩展函数运行的作用域
    window.color = "red";
    var o = {color: "blue"};

    function sayColor()
    {
        alert(this.color);
    }
    sayColor(); // red

    sayColor.call(this); // red
    sayColor.call(window); // red
    sayColor.call(o); // blue




posted @ 2014-04-02 23:13  好记性还真不如烂笔头  阅读(265)  评论(0编辑  收藏  举报