• call , apply , caller , callee


    1.call:

    应用于:Function对象;

    调用一个对象的一个方法,以另一个对象替换当前对象;

    call(thisObj[,arg1[,arg2[,arg3,[argN]]]]);

    参数:

    thisObj:将被用作当前对象的对象;

    arg1...argN:将被传递方法参数序列;

    说明:

    call方法可以用来代替另一个对象调用一个方法;

    call方法可以讲一个函数的对象上下文从初始的上下文改变成thisObj指定的新对象;

    ex:

    obj1.method.call(obj2,arg1,arg2);

    call的作用就是把obj1的方法放到obj2上去使用,而arg1,arg2可以当作参数传入;

    举一个具体的例子:

    function add(a,b){
        alert(a+b);
    }
    
    function sub(a,b){
        alert(a-b);
    }
    
    add.call(sub,2,3);  //5

    //这个例子就是用add代替sub == add(2,3);

    举一个复杂点的例子:

    function class1(){
        this.name="class1";
        
        this.showName=function(){
            alert(this.name);
        }
    }
    
    function class2(){
        this.name="class2";
    }
    
    var c1=new class1();
    var c2=new class2();
    
    c1.showName.call(c2);  //class2

    //这个例子中把c1的showName方法放到c2上来执行,结果自然是class2;

    用call方法来实现继承:

    function person(){
        this.showAge=function(num){
            alert('我今年'+num+'岁');
        };    
    };
    
    function person2(){
        person.call(this);
    }
    
    var p2=new person2();
    
    p2.showAge(20);  //我今年20岁;

    //person.call(this);  的意思是用this也就是person来代替person2,这样person2就拥有了person的所有方法;

    实现多重继承:

    function person(){
        this.showAge=function(num){
            alert('我今年'+num+'岁');
        };    
    };
    
    function person2(){
        this.showName=function(name){
            alert('我叫'+name);    
        };
    };
    
    function person3(){
        person.call(this);
        person2.call(this);
    };
    
    var p3=new person3();
    
    p3.showAge(21);  //我今年21岁;
    p3.showName('smile');  //我叫smile;

    //很简单,使用2个call就实现了多重继承;

    2.apply:

    和call用法基本相同,只是第二参数必须是数组也可以是arguments;

    obj1.apply(thisObj,[arg1,arg2...argN]);
    
    obj1.apply(thisObj,arguments);

    3.caller:


    返回一个对函数的引用,该函数调用了当前函数;

    functionName.caller

    对于函数来说,caller属性只有在函数执行时才有定义.

    如果函数是由顶层调用的那么caller包含的就是null;

    如果在字符串上下文中使用了caller属性,那么和functionName.toString一样,也就是说,显示的是函数的反编译文本;

    ex:

    function callerDemo(){
        if(callerDemo.caller){
            var a=callerDemo.caller.toString();
            alert(a);
        }else{
            alert("this is a top function");
        }
    };
    
    function handleCaller(){
        callerDemo();
    }
    callerDemo();  //this is a top function;  
    handleCaller();    //function handleCaller(){ callerDemo(); }

    4.callee:


    返回正被执行的 Function 对象,也就是指定的Function对象的正文;

    [function.]arguments.callee;

    可选项:function参数是当前正在执行的 Function 对象的名称;

    说明:


    callee的初始值就是正被执行的function对象;

    callee属性是arguments对象的一个成员,它表示对函数对象本身的引用,这有利于匿名函数的递归,或者是保证函数的封装性;

    //arguments.length是实参的长度;
    
    //arguments.callee.length是形参的长度;

    //由此可以判断形参和实参的长度是否一致;

    ex:

    function calleeDemo(){
        alert(arguments.callee);
    }
    
    //可以打印其自身;
    //  function calleeDemo(){
    //      alert(arguments.callee);
    //  }

    验证形参和实参的长度是否一致;

    function calleeLengthDemo(arg1,arg2){
        if(arguments.length==arguments.callee.length){
            alert('形参和实参长度一致!');
        }else{
            alert('形参长度为:'+arguments.callee.length);
            alert('实参长度为:'+arguments.length);
        }
    }

    递归函数:

    var sum=function(n){
        if(n<=0){
            return 1;
        }else{
            return n+arguments.callee(n-1);
        }
    };
    
    sum(2)     //4;
    sum(3)     //7;
  • 相关阅读:
    map/reduce/filter/lambda
    DHCP Option43配置
    函数的参数
    通用路由封装协议——GRE
    spring 中使用quartz实现定时任务
    自己实现的简单的grid
    Java 中 Double 相关问题
    爬坑纪——RESTful WCF
    Hi,UEditor——百度编辑器配置若干
    去除ColumnChart自带的阴影效果
  • 原文地址:https://www.cnblogs.com/SmileCN/p/3009960.html
Copyright © 2020-2023  润新知