`
yolio2003
  • 浏览: 13428 次
  • 性别: Icon_minigender_1
  • 来自: 上饶
最近访客 更多访客>>
社区版块
存档分类
最新评论

Javascript中call的使用

    博客分类:
  • js
阅读更多

貌似理解了 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中call与apply方法

    关于Javascript中call与apply的进一步探讨

    在JavaScript中,`call`和`apply`是两个非常重要的方法,它们都用于改变函数调用时的上下文(即`this`的值),并且可以灵活地传递参数。本篇文章将深入探讨这两个方法的用法、区别以及实际应用场景。 `call`方法...

    callJavaScript

    本话题聚焦于"callJavaScript",即如何在C++程序中调用JavaScript代码。这个标题暗示了我们将探讨一种技术,使C++能够利用JavaScript的灵活性和动态性,而无需离开C++的高效执行环境。 首先,C++调用JavaScript的一...

    淡淡简单描述javascript中方法apply和call

    淡淡简单描述javascript中方法apply和call

    javascript_call_cpp.zip

    标题“javascript_call_cpp.zip”揭示了这个压缩包包含的项目是关于使用JavaScript调用C++代码的示例。描述提到这是在Visual Studio 2015环境下测试通过的,能够直接运行并展示WebBrowser控件中C++与JavaScript的...

    Javascript类的继承,使用this.callParent调用超类方法

    在本话题中,我们将深入探讨JavaScript中的类继承,并特别关注`this.callParent`这个方法,它是如何被用来调用超类方法的。 首先,让我们了解JavaScript中的构造函数。构造函数是一种特殊的函数,用于创建和初始化...

    javascript中call和apply方法浅谈

    在JavaScript中,`call`和`apply`是两种非常重要的函数调用方式,它们都用于改变函数内部`this`的指向,实现函数的动态绑定。这两个方法都是Function对象的原型方法,可以应用到任何函数上。 首先,让我们深入理解`...

    javascript callApply代码示例

    javascript callApply代码示例

    浅谈javascript中的call、apply、bind_.docx

    其实,ES5 引入 bind 的真正目的是为了弥补 call/apply 的不足,由于 call/apply 会对目标函数自动执行,从而导致它无法在大事绑定函数中使用,而 bind 在实现转变函数 this 的同时又不会执行对应的函数。...

    跟我学习javascript的call(),apply(),bind()与回调

    本文将详细解释JavaScript中call(), apply(), 和 bind() 方法的作用、语法以及使用场景,并且会探讨回调函数的使用,帮助理解这些概念在实际编程中的应用。 首先,我们来探讨call() 和 apply() 方法。这两个方法都...

    Javascript 中的 call 和 apply使用介绍

    总的来说,`call`和`apply`是JavaScript中实现动态上下文绑定和灵活参数传递的重要工具,对于理解和使用JavaScript的高级特性,如原型继承、函数封装和异步处理等,具有至关重要的地位。掌握它们的用法能够极大地...

    JavaScript中this关键字使用方法详解

    在JavaScript编程语言中,`this`关键字是一个至关重要的概念,它常常引发初学者的困惑,因为它的值在不同的上下文中可能会有所不同。`this`关键字主要用来引用对象的上下文,或者说是当前执行环境中的对象。在本文中...

    浅谈javascript中的call、apply、bind.doc

    浅谈javascript中的call、apply、bind.doc

    javascript使用call调用微信API

    示例代码中展示了如何使用JavaScript的call方法来调用微信API。在代码中定义了两个构造函数Class1和Class2,Class1中包含了方法showNam和属性aaa。当执行c1.showNam.call(c2)时,this的指向被改变为c2对象,因此可以...

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

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

    理解JavaScript的caller callee call apply

    ### 理解JavaScript中的`caller`, `callee`, `call`, `apply` #### Arguments对象:JavaScript函数调用的参数管理器 在JavaScript中,每个函数都有一个隐含参数`arguments`,它允许开发者访问传递给函数的所有参数...

    javascript中apply、call和bind的用法区分_.docx

    ### JavaScript中apply、call和bind的用法区分 在JavaScript编程中,`apply`、`call`和`bind`这三个方法被广泛用于改变函数内部`this`的指向,这对于理解和编写复杂的JavaScript代码至关重要。虽然它们的功能相似,...

    iphone javascript call objectc method in uiwebview

    这篇博文(原始链接:https://13146489.iteye.com/blog/1317394)可能探讨了如何实现在 UIWebView 中使用 JavaScript 调用 Objective-C 的方法。 首先,理解 JavaScript 和 Objective-C 之间的交互机制是关键。在 ...

    JavaScript中的apply和call函数详解_.docx

    在JavaScript中,`apply`和`call`是两种非常重要的函数调用方式,它们都用于改变函数内部`this`的指向以及动态传递参数。这两者的主要区别在于参数的传递方式。 首先,`this`在JavaScript中是一个关键字,它在不同...

    Javascript - 全面理解 caller,callee,call,apply (转载)

    这篇文章将深入探讨四个关键概念:caller、callee、call和apply,它们都是JavaScript函数操作的核心部分,对于理解和使用高级JavaScript编程至关重要。 首先,我们来了解`caller`和`callee`。在JavaScript的函数...

Global site tag (gtag.js) - Google Analytics