`

call理解

阅读更多

 call使用情况
    1.class.call(obj)
        让obj进入class的上下文执行,替代this指针。
    2.class.call(class)

    3.obj1.method.call(obj2);
     改变obj1.method方法中上下文执行,替代this指针。(只改变了method方法中的this,没有改变class中的this)

    4.fn.call(fn) 与 class.call(class) 一样,只是 没有this,也就是单纯的改变函数的执行环境。
       function add(a,b){
            alert(a+b);
       }
       function sub(a,b){
            alert(a-b);
       }

       add.call(sub,3,1); //4  add中没有this,所以sub直接忽略
    5.*此引用和第4点差不多,只是有一点变化,fn也就是函数,每个函数都属于Function.prototype,所以都有call apply方法。
       function f1(){
            alert(1);
       }
       function f2(){
            alert(2);
       }
       var f3 = f1.call;
       f1.call(f2);//1
       f3.call(f2);//2    等效 f1.call.call(f2)


        /***下面例子复杂一点***/
        function jsCall(oThis){
            var argsNew = [];
            for(var i=1;i<arguments.length;i++){
                argsNew.push(arguments[i]);
            }

           // alert(this);
            return this.apply(oThis,argsNew);   //这里的this就是当前执行函数
        }
        Function.prototype.jsCall = jsCall;


        function f1(a){
            alert([this,a,'f1']);

        }
//        f1.jsCall = function (oThis){
//            var argsNew = [];
//            for(var i=1;i<arguments.length;i++){
//                argsNew.push(arguments[i]);
//            }
//
//            // alert(this);
//            return this.apply(oThis,argsNew);
//        }

        function f2(a){
            alert([this,a,'f2']);
        }
//        f1(33);
        f1.jsCall(f2,11);         //f2直接替换f1中的this

 


 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics