貌似理解了 http://hszy00232.blog.163.com/blog/static/43022753201131835653841/
6.不错,接下来再理解一个怪异的形式
示例10:
function f1(){
alert(1);
}
function f2(){
alert(2)
}
var f3 = f1.call;
f1.call(f2);//1
f3.call(f2);//2
f1.call(f2);比较好理解,如果不理解看上边的case,但如何理解f3.call(f2)会返回2呢,为了方便理解进行一下等效变化为f1.call.call(f2),这时会发现实际上是f1.call方法call调用了f2,那f1怎么又会有call方法呢?call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法都有call, apply属性。
在理解f1.call.call(f2)时我们首先要知道call方法到底是如何执行的,这样才能f1.call.call(f2)如何执行。
示例11:
引用JK写的一个用apply实现call的方法:
function jsCall(oThis){//这里的jsCall就是Call
var argsNew = [];
for(var i=1;i<arguments.length;i++){
argsNew.push(arguments[i]);
}
return this.apply(oThis,argsNew);
}
Function.prototype.jsCall = jsCall;
或简写成
function jsCall(oThis){//这里的jsCall就是Call
var argsNew = [].slice.call(arguments,1)
return this.apply(oThis,argsNew);
Function.prototype.jsCall = jsCall;
这样就得到了一个和call一样功能的jsCall.
接下来构建两个函数f1,f2
function f1(a){
alert([this,a,'f1']);
}
f1(11);//[object Window],11,f1
function f2(a){
alert([this,a,'f2']);
}
f2(22);//[object Window],11,f2
用jsCall把f1中的this替换成f2
function f1(a){
alert([this,a,'f1']);
}
function f2(a){
alert([this,a,'f2']);
}
f1.jsCall(f2,11);//function f2(a){alert([this, a, "f2"]);},11,f1
function jsCall(oThis){//这里的jsCall就是Call
var argsNew = [].slice.call(arguments,1)
return this.apply(oThis,argsNew);
}
Function.prototype.jsCall = jsCall;
function f1(a){
alert([this,a,'f1']);
}
function f2(a){
alert([this,a,'f2']);
}
f1.jsCall.jsCall(f2,11);//11,,f2
在执行f1.jsCall.jsCall(f2,11);时返回11,,f2,为什么会返回这个结果,重点来了:)
f1.jsCall方法:
alert(f1.jsCall);
//返回
//function jsCall(oThis) {
// var argsNew = [].slice.call(arguments, 1);
// return this.apply(oThis, argsNew);
//}
所以f1.jsCall.jsCall可以替换成jsCall.jsCall看一下执行结果
function jsCall(oThis){//这里的jsCall就是Call
var argsNew = [].slice.call(arguments,1)
return this.apply(oThis,argsNew);
}
Function.prototype.jsCall = jsCall;
function f1(a){
alert([this,a,'f1']);
}
function f2(a){
alert([this,a,'f2']);
}
jsCall.jsCall(f2,11);//11,,f2
接着分析
jsCall在执行的过程中,return this.apply(oThis,argsNew);里的this被替换成了f2,11做为参数传给了(oThis,argsNew),变成了f2.apply(11);
function jsCall(oThis){//这里的jsCall就是Call
var argsNew = [].slice.call(arguments,1)
return this.apply(oThis,argsNew);
}
Function.prototype.jsCall = jsCall;
function f1(a){
alert([this,a,'f1']);
}
function f2(a){
alert([this,a,'f2']);
}
f2.apply(11);//11,,f2
返回结果跟f1.jsCall.jsCall(f2,11)一样。
回过头来看
function f1(){
alert(1);
}
function f2(){
alert(2)
}
var f3 = f1.call;
f1.call(f2);//1
f3.call(f2);//2
这样就不难理解f1.call.call(f2)实现时,f1.call执行过程中call中的this被f2替换成了f2.call();因为f2里没有this的引用所以执行结果是2.
f2.call()//2
需要十分注意的是f1.call是方法,f1是函数对象,这两者在call时是有区别的。
------------------------------------------我的理解----------------------------------------------
function flower(){
this.pollen="花粉";
this.petal=function(){//花瓣
console.log("leaf and bud"+this.pollen);
};
}
function flower2(){}
var seed=new flower();
var seed2=new flower2();
var tree={};
//小蜜蜂call花flower花flower2种子seed种子seed2树tree
//盛开的花朵this花粉pollen花瓣petal
console.log(flower.call(tree),tree,"例1");
//call把flower的this里面的pollen和petal都洒在了tree上了
tree={};
console.log(seed.petal(),seed,"例2+例3");
//call把flower的this里面的pollen和petal都洒在了seed上了
console.log(flower.call(seed2),seed2,"例4+例5");
//call把flower的this里面的pollen和petal都洒在了flower2的seed2上了
console.log(flower.call(flower2),"例6");
//call把flower的this里面的pollen和petal都洒在了flower2上了,但是被flower巨大的花朵this挡住了,一般人看不见只能摸摸看了
seed2=new flower2();
console.log(seed.petal.call(seed2),seed2,"例7+例8");
//call把seed的petal的this中的东东(好像什么都没有啊!!)洒在了seed2中,(真的饿什么都没有)
console.log(flower.call.call(flower2)===flower2.call(null),"例9");
//正在flower采蜜的call呼叫call,也就是call.call(flower2)=flower2.call()写道
再推荐个: http://www.cnblogs.com/winter-cn/archive/2009/05/16/1458390.html
分享到:
相关推荐
JavaScript中call与apply方法
淡淡简单描述javascript中方法apply和call
javascript callApply代码示例
NULL 博文链接:https://ufoqhmdt.iteye.com/blog/1676748
提供头文件、lib及dll,实现c++调用js
1、call,apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例(就是每个方法)都有call,apply属性。既然作为方法的属性,那它们的使用...
我们可以将call和apply看做是某个对象的方法,通过调用方法的形式来间接调用函数
理解JavaScript的caller callee call apply
浅谈javascript中的call、apply、bind_.docx
call(obj,arg1,arg2,arg3);call第一个参数传对象,可以是null。参数以逗号分开进行传值,参数可以是任何类型。 apply(obj,[arg1,arg2,arg3]);apply第一个参数传对象,参数可以是数组或者arguments 对象。 这两个...
本文实例分析了JavaScript中call和apply方法的区别。分享给大家供大家参考,具体如下: 这两个方法不经常用,但是在某些特殊场合中是非常有用的,下面主要说下它们的区别: 1、首先,JavaScript是一门面向对象的语言...
JavaScript中的apply和call函数详解_.docx
JavaScript 中通过call或者apply用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。简单的说就是改变函数执行的上下文,这是最基本的用法。两个方法基本区别...
主要介绍了javascript使用call调用微信API,需要的朋友可以参考下
javascript中apply、call和bind的用法区分_.docx
Synchronous Javascript call using Scriptable XML webservice (SJAX)。 http://www.linjon.cn, 成都领君科技有限公司
一些简单的Javascript操作中较少会用到call和apply函数,在另外一些较大型的操作中,如web应用开发,js框架开发中可能会经常遇到这两个函数。关于这两个函数的解释,网上的资料也很多,但是本人认为很多资料要么...
先看一下官方的解释: call 方法 请参阅 应用于:Function 对象 要求 版本 5.5 调用一个对象的一个方法,以另一个对象替换当前对象。 call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 参数 thisObj 可选项。将被用作...
JavaScript函数之call、apply以及bind方法案例详解 总结 1、相同点 2、区别 call() 方法 /* 正常模式 */ let obj = { sum(a, b) { console.log(this) return a + b } } // 执行 sum 函数的 apply、bind...
以下内容会分为如下小节: 1.call/apply/bind方法的来源 2.Function.prototype.call() ...首先,在使用call,apply,bind方法时,我们有必要知道这三个方法究竟是来自哪里?为什么可以使用的到这三个方法?