`

Function.prototype.apply.call的总结

阅读更多

 

网上看到一段代码,哎,觉得挺不错,然后来分析一下,

首先需要了解apply,call的基本用法,其目的是改变调用方法中的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]);

 

1
0
分享到:
评论
1 楼 fatbear007 2016-07-28  
怎么觉得,这种写法,让人看不懂外,可以用在哪些场景下呢?

相关推荐

    Function.prototype.call.apply结合用法分析示例

    昨天在网上看到一个很有意思的js面试题:var a = Function.prototype.call.apply(function(a){return a;}, [0,4,3]);alert(a); 分析步骤如下,感兴趣的朋友可以参考下哈

    Function.prototype.apply()与Function.prototype.call()小结

    老是忘掉这两个东东的用下,写下来做个记录吧。 他们作用是一模一样的,只是传入...call传入的参数不固定,和apply相同的是,第一个参数也是代表函数体内的this指向,第二个参数开始往后,每个参数被依次传入函数: v

    function.prototype:适用于Function.prototype的Polyfill。{apply,bind,call}

    函数原型polyfill 这是三个基本功能方法填充工具apply , bind和call的 是的,因为它实际上可以兼容*。 你为什么要问? 很好地证明了观点,并展示了您可以使用诸如JavaScript / ECMAScript之类的动态语言来完成的...

    Javascript中call,apply,bind方法的详解与总结

    2.Function.prototype.call() 3.Function.prototype.apply()  3.1:找出数组中的最大数  3.2:将数组的空元素变为undefined  3.3:转换类似数组的对象 4.Function.prototype.bind() 5.绑定回调函数的对象 6.call...

    完美解决IE低版本不支持call与apply的问题

    Function.prototype的apply和call是在1999年发布的ECMA262 Edition3中才加入的(1998年发布ECMA262 Edition2)。在此前的的浏览器如IE5.01(JScript 5.0)中是没有apply和call的。因此会带来一些兼容性问题,以下是...

    javascript中apply和call方法的作用及区别说明

    1、call,apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例(就是每个方法)都有call,apply属性。既然作为方法的属性,那它们的使用...

    JavaScript中apply与call的用法意义及区别说明

    apply和call,它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数的方式有所区别: Function.prototype.apply(thisArg,argArray); Function.prototype.call(thisArg[,arg1[,arg2…]]); 从函数原型...

    浅谈JS中的反柯里化( uncurrying)

    反柯里化 相反,反柯里化的作用在与扩大函数的适用性,使本来作为特定对象所拥有的功能的函数可以被任意对象所用. 即把如下给定的函数签名, ... return Function.prototype.call.apply(that, argum

    JavaScript中apply方法的应用技巧小结

    Function.prototype.call = function () { var ctx = [].shift.apply(arguments) return this.apply(ctx, arguments) } 二、apply实现bind Function.prototype.bind = function () { var ctx = [].shift.apply...

    jiangxiaoyu66#knowledgeBase-1.0#02. apply、call、bind实现1

    apply、call、bind实现思路:把函数作为对象的属性,这样就相当于使用对象来调用函数,即this指向为指定的对象Function.prototype.c

    apply和call方法定义及apply和call方法的区别

    如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而...call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实

    js中apply与call简单用法详解

    call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法都有call, apply属性.既然作为方法的属性,那它们的使用就当然是...

    simplewebrtc.js webrtc网页视频开发帮助工具

    webkitRTCPeerConnection.prototype.getRemoteStreams = function() { return this.remoteStreams; }; } } else { webRTCSupport = false; throw new Error("Browser does not appear to be WebRTC-capable");...

    caohonghai#docs#手动实现apply call bind1

    // 定义一个全局变量var obj = {a: 2} // 定义一个对象用来绑定// 定义一个函数用来执行Function.prototype._call =

    使用 js 简单的实现 bind、call 、aplly代码实例

    这篇文章主要介绍了使用 js 简单的实现 bind、call 、aplly代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 ...Function.prototype._apply =

    详解js中的apply与call的用法

    在ECAMScript3给Function的原型定义了两个方法,它们是Function.prototype.call和Function.prototype.apply。本文详细介绍了apply与call的用法,有需要的可以参考下。

    给Function做的OOP扩展

    代码如下:// 下面是OOP用的方法 // 这样很猥琐……因为JS并不是OOP语言…… // 但伟大的伍... } Function.prototype.create = function(){ //类的创建器,和用new等价 //JS不支持在构造器用call和apply,所以…… //Bel

    javascript中call apply 的应用场景

    call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法都有call, apply属性.

Global site tag (gtag.js) - Google Analytics