美文网首页
Function.prototype.apply.call 理解

Function.prototype.apply.call 理解

作者: 如果俞天阳会飞 | 来源:发表于2019-08-27 15:53 被阅读0次

    Function.prototype.apply.call 理解分析

    首先需要了解apply,call的基本用法,其目的是改变调用方法中的this指向,将其指向为传入的对象,改变this的指向,两种方法接收参数的方式不同。

    代码:console.log

    var console = window.console || {log: function () {}};   
    var log = console.log;  
    console.log = function(tips,message){   
       Function.prototype.apply.call(log, console, arguments);   
       //Function.prototype.call.call(log, console, arguments);  
       //Function.prototype.call.apply(log, [console, arguments]);   
        
     //传统方式  
     //var args=[].slice.call(arguments);  
     //log.apply(console,args);  
    }  
    

    执行结果:

    console.log("测试","This is test");  
    测试 This is test  
    

    分析:

    该怎么理解Function.prototype.apply.call(log,console,arguments);呢
    
    首先可以将Function.prototype.apply看成一个整体-->FunctionApply
    
    FunctionApply.call(log,console,arguments);
    
    那么将此句翻译一下
    
    log.FunctionApply(console,arguments);
    
    然后再翻译一下,你就懂了吧,就是一个普通方法调用了
    
    console.log(arguments);
    

    发散思维:

    Function.prototype.call.apply(log,[console.arguments]);
    
    FunctionCall.apply(log,[console,arguments]);  
    log.FunctionCall(console,arguments);  
    console.log(arguments);  
    

    小tips:

     Function.prototype.apply.call  等同于Function.prototype.call.call
     Function.prototype.call.apply  等同于 Function.prototype.apply.apply
    

    例子:

    function testA(a){  
        console.log('aaaa',a);  
    }  
    Function.prototype.apply.call(testA,window,['Mike']);  
    //Function.prototype.call.call(testA,window,['Mike']);  
    //testA.apply(window,['Mike']);  
    //window.testA('Mike');  
    //Function.prototype.apply.apply(testA,[window,['Mike']]);  
    //Function.prototype.call.apply(testA,[window,['Mike']]);  
    

    以上执行结果都一样

    为:aaaa Mike

    总结使用用法:

    XXX可以是call或者是apply,child一定是parent可指向的对象

    Function.prototype.XXX.call(child,parent,arguments||array);

    Function.prototype.XXX.apply(child,[parent,arguments||array]);

    相关文章

      网友评论

          本文标题:Function.prototype.apply.call 理解

          本文链接:https://www.haomeiwen.com/subject/ogmeectx.html