zoukankan      html  css  js  c++  java
  • 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




  • 相关阅读:
    .NET : 单元测试到底给我们带来什么
    .NET : 如何将16进制颜色代码转换为十进制
    LINQ : 谈谈LINQ TO SQL中的直接加载和延迟加载
    .NET : 单元测试的几个Attribute介绍
    .NET : 在单元测试中使用外部文件作为数据源
    再来谈谈json
    .NET : 关于图片格式的问题
    VSTS : 比较性能基准
    .NET : 如何将大文件写入到数据库中
    LINQ : 如何在JOIN或者GROUP BY的时候使用复合键
  • 原文地址:https://www.cnblogs.com/lin3615/p/3641910.html
Copyright © 2011-2022 走看看