javascript中的call和apply混用详解
2016-11-20 23:07
337 查看
最近发现这样一串代码。大家先来帮我看一下。
看完代码估计大家应该猜得出结果,就是往arr数组里面添加了两个元素,但是究竟是怎么做到的呢? 这里不卖关子,我们来看一下另外一种实现方式
代码变成了这样大家是不是就能看懂了呢?最起码比第一种实现方式的可理解性要强得多。这里不对apply 和 call 方法做详细的讲解。不了解这两个方法的同学可以先百度一下看看这两个方式到底是怎么玩的,然后再来阅读我的代码。好了,接下来我们要来讲解第一种方法的原理到底是怎么实现的了。
这里我们可以先把Function.prototype.call看作是一个整体这里我们叫他Call好了。
这时我们的代码是这样的
Call.apply(testApply,[{},”lisi”])
上面的代码可以理解成这样
testApply.apply({},”lisi”)
这个时候是不是代码结果就显而易见了呢?
那为什么可以这么理解呢? 实际上这段代码的意思是把testApply的this绑定到{}身上。
然后把参数”lisi”传递给testApply方法然后执行一下
下面这段代码的结果跟上面是一样一样的。
Function.prototype.apply.apply(testApply,[{},”lisi”])
当然我们发散一下思维还可以编写这样的代码
这个理解方式跟上面那个差不多、这里就不再重复了。
Function.prototype.uncurrying = function(){ var self = this; return function(){ Function.prototype.call.apply(self,arguments); } } var push = [].push.uncurrying(); var arr = []; push(arr,1,2) console.log(arr)
看完代码估计大家应该猜得出结果,就是往arr数组里面添加了两个元素,但是究竟是怎么做到的呢? 这里不卖关子,我们来看一下另外一种实现方式
Function.prototype.uncurrying=function(){ var self = this; return function(){ var obj = [].shift.call(arguments); self.apply(obj,arguments); } } var push = [].push.uncurrying(); var arr = []; push(arr,1,2) console.log(arr)
代码变成了这样大家是不是就能看懂了呢?最起码比第一种实现方式的可理解性要强得多。这里不对apply 和 call 方法做详细的讲解。不了解这两个方法的同学可以先百度一下看看这两个方式到底是怎么玩的,然后再来阅读我的代码。好了,接下来我们要来讲解第一种方法的原理到底是怎么实现的了。
function testApply(name){ console.log(name) } Function.prototype.call.apply(testApply,[{},"lisi"])
这里我们可以先把Function.prototype.call看作是一个整体这里我们叫他Call好了。
这时我们的代码是这样的
Call.apply(testApply,[{},”lisi”])
上面的代码可以理解成这样
testApply.apply({},”lisi”)
这个时候是不是代码结果就显而易见了呢?
那为什么可以这么理解呢? 实际上这段代码的意思是把testApply的this绑定到{}身上。
然后把参数”lisi”传递给testApply方法然后执行一下
下面这段代码的结果跟上面是一样一样的。
Function.prototype.apply.apply(testApply,[{},”lisi”])
当然我们发散一下思维还可以编写这样的代码
function testCall(){ console.log(this.name) } Function.prototype.apply.call(testCall,{name:"zhangsan"}) //也可以这样 //Function.prototype.call.call(testCall,{name:"zhangsan"})
这个理解方式跟上面那个差不多、这里就不再重复了。
相关文章推荐
- javascript中apply()和call()方法详解
- JavaScript中的apply和call函数详解
- javascript apply call详解
- javascript 中的apply()和call()方法详解
- 基于JavaScript实现继承机制之调用call()与apply()的方法详解
- JavaScript中的this,call,apply使用及区别详解
- javascript中call()和apply()的用法及区别详解
- JavaScript方法call,apply,caller,callee,bind的使用详解及区别
- javascript 中的apply()和call()方法详解
- 详解javascript中的call, apply
- 【转载】javascript技术难点(三)之this、new、apply和call详解
- javascript中 Function.prototype.apply()与Function.prototype.call() 对比详解
- javascript call和apply方法详解
- JavaScript方法call,apply,caller,callee,bind的使用详解及区别
- Javascript中call和apply的区别与详解
- Javascript中的apply与call详解
- Javascript中的apply与call详解
- js的 function, javascript内置对象apply,call,this概念及之间的关系详解
- javascript中的Array对象的slice()、call()、apply()详解
- JavaScript中的apply和call函数详解(转)