网上看到一段代码,哎,觉得挺不错,然后来分析一下,
首先需要了解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]);
相关推荐
昨天在网上看到一个很有意思的js面试题:var a = Function.prototype.call.apply(function(a){return a;}, [0,4,3]);alert(a); 分析步骤如下,感兴趣的朋友可以参考下哈
老是忘掉这两个东东的用下,写下来做个记录吧。 他们作用是一模一样的,只是传入...call传入的参数不固定,和apply相同的是,第一个参数也是代表函数体内的this指向,第二个参数开始往后,每个参数被依次传入函数: v
函数原型polyfill 这是三个基本功能方法填充工具apply , bind和call的 是的,因为它实际上可以兼容*。 你为什么要问? 很好地证明了观点,并展示了您可以使用诸如JavaScript / ECMAScript之类的动态语言来完成的...
2.Function.prototype.call() 3.Function.prototype.apply() 3.1:找出数组中的最大数 3.2:将数组的空元素变为undefined 3.3:转换类似数组的对象 4.Function.prototype.bind() 5.绑定回调函数的对象 6.call...
Function.prototype的apply和call是在1999年发布的ECMA262 Edition3中才加入的(1998年发布ECMA262 Edition2)。在此前的的浏览器如IE5.01(JScript 5.0)中是没有apply和call的。因此会带来一些兼容性问题,以下是...
1、call,apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例(就是每个方法)都有call,apply属性。既然作为方法的属性,那它们的使用...
apply和call,它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数的方式有所区别: Function.prototype.apply(thisArg,argArray); Function.prototype.call(thisArg[,arg1[,arg2…]]); 从函数原型...
反柯里化 相反,反柯里化的作用在与扩大函数的适用性,使本来作为特定对象所拥有的功能的函数可以被任意对象所用. 即把如下给定的函数签名, ... return Function.prototype.call.apply(that, argum
Function.prototype.call = function () { var ctx = [].shift.apply(arguments) return this.apply(ctx, arguments) } 二、apply实现bind Function.prototype.bind = function () { var ctx = [].shift.apply...
apply、call、bind实现思路:把函数作为对象的属性,这样就相当于使用对象来调用函数,即this指向为指定的对象Function.prototype.c
如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而...call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实
call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法都有call, apply属性.既然作为方法的属性,那它们的使用就当然是...
webkitRTCPeerConnection.prototype.getRemoteStreams = function() { return this.remoteStreams; }; } } else { webRTCSupport = false; throw new Error("Browser does not appear to be WebRTC-capable");...
// 定义一个全局变量var obj = {a: 2} // 定义一个对象用来绑定// 定义一个函数用来执行Function.prototype._call =
这篇文章主要介绍了使用 js 简单的实现 bind、call 、aplly代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 ...Function.prototype._apply =
在ECAMScript3给Function的原型定义了两个方法,它们是Function.prototype.call和Function.prototype.apply。本文详细介绍了apply与call的用法,有需要的可以参考下。
代码如下:// 下面是OOP用的方法 // 这样很猥琐……因为JS并不是OOP语言…… // 但伟大的伍... } Function.prototype.create = function(){ //类的创建器,和用new等价 //JS不支持在构造器用call和apply,所以…… //Bel
call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法都有call, apply属性.