`

JavaScript中Apply和Call原理分析与使用

阅读更多

不同的定义

  1. JavaScript函数或者说是对象中定义的函数可以动态的绑定到另一个函数中,即即使函数f2中未定义函数f1中的子函数ff1,f2也可以调用ff1,apply与call可以实现这种用法。
  2. JavaScript对apply和call的解释是:使用指定对象替换当前对象并调用函数。
  3. apply和call:它们的作用都是将函数绑定到另外一个对象上去运行 ,两者仅在定义参数上不同。

详细介绍

JavaScript动态变换运行时上下文特性,这种特性主要就体现在apply, call两个方法的运用上.

 

call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于 Function.prototype,所以每个Function对象实例,也就是每个方法都有call, apply属性.既然作为方法的属性,那它们的使用就当然是针对方法的了.这两个方法是容易混淆的,因为它们的作用一样,只是使用方式不同.

 

区分apply,call就一句话,

foo.call(this, arg1,arg2,arg3) == foo.apply(this, arguments)==this.foo(arg1, arg2, arg3)

 
相同点:两个方法产生的作用是完全一样的
不同点:方法传递的参数不同

 

我们就上面的foo.call(this, arg1, arg2, arg3)展开分析.

foo是一个方法,this 是方法执行时上下文相关对象 ,arg1, arg2, arg3是传给foo方法的参数.这里所谓的方法执行时上下文相关对象, 如果有面向对象的编程基础,那很好理解,就是在类实例化后对象中的this.


在JavaScript中,代码总是有一个上下文对象,代码处理该对象之内. 上下文对象是通过this变量来体现的, 这个this变量永远指向当前代码所处的对象中.


引用网上一个代码段,运行后自然就明白其道理。

<input type="text" id="myText"   value="input text">
<script>
    function Obj(){this.value="对象!";}
    var value="global 变量";
    function Fun1(){alert(this.value);}

    window.Fun1();   //global 变量
    Fun1.call(window);  //global 变量
    Fun1.call(document.getElementById('myText'));  //input text
    Fun1.call(new Obj());   //对象!
</script>

 
call函数和apply方法的第一个参数都是要传入给当前对象的对象,及函数内部的this。后面的参数都是传递给当前对象的参数。
运行如下代码:

<script>
   var func=new function(){this.a="func"}
    var myfunc=function(x){
        var a="myfunc";
        alert(this.a);
        alert(x);
    }
    myfunc.call(func,"var");
</script>

 可见分别弹出了func和var。到这里就对call的每个参数的意义有所了解了。

 

 这就是动态语言 JavaScript call的威力所在!

 

参考资料

http://www.cnblogs.com/fighting_cp/archive/2010/09/20/1831844.html

http://www.cnblogs.com/cc258/archive/2012/04/21/2462547.html

http://www.spacespace.cn/read.php?153

 

分享到:
评论

相关推荐

    从JQuery源码分析JavaScript函数的apply方法与call方法

    JQuery源码分析与JavaScript中的apply与call方法是JavaScript编程中非常重要的概念,这两者都是函数对象的方法,用于在特定的作用域中执行函数,并可以指定函数体内this的指向。从JQuery源码中分析apply和call方法,...

    js中apply()和call()的区别与用法实例分析.docx

    在JavaScript中,`apply()`和`call()`是两种非常重要的函数调用方式,它们都是用于改变函数执行时的上下文,即改变`this`的指向。这两种方法的主要区别在于它们接收参数的方式,但最终目的都是为了让函数能在不同的...

    JavaScript中call和apply方法的区别实例分析

    了解并掌握 `call` 和 `apply` 的使用,能帮助开发者更好地理解和编写JavaScript代码,尤其在处理对象方法、函数封装、参数传递等场景中。同时,理解`this`、`arguments` 和 `callee` 的工作原理也是提升JavaScript...

    js代码-JavaScript的call/apply/bind函数实现

    在JavaScript中,`call()`, `apply()`, 和 `bind()` 是三个非常重要的函数,它们都与函数调用有关,但各自有不同的应用场景。本文将深入探讨这三个函数的实现原理及其使用方式。 首先,`call()` 函数允许我们调用一...

    JavaScript中this的使用

    下面我们将深入探讨`this`的使用和一些常见场景。 1. **基本理解**: `this`的值取决于函数调用的方式。在JavaScript中,`this`可以指向以下四种情况之一: - **全局或函数外部**:在全局作用域中,`this`指向`...

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

    在JavaScript中,`Function.prototype.call` 和 `Function.prototype.apply` 是两种非常重要的方法,它们都是用来改变函数调用时的上下文(即`this`值)以及传递参数。在这个特殊的面试题中,这两种方法被结合在一起...

    【JavaScript源代码】JavaScript中new操作符的原理示例详解.docx

    通过以上的分析,我们了解了`new`操作符在JavaScript中的工作原理,包括如何创建新对象、设置原型链、绑定`this`上下文以及返回新对象。这些知识对于深入理解和使用JavaScript的面向对象编程至关重要。

    深入理解JavaScript中的this关键字

    通过上述分析,我们可以看到`this`在JavaScript中的重要性和灵活性。正确理解和运用`this`,能够帮助开发者更好地掌握JavaScript的面向对象编程,从而在项目开发中游刃有余。对于初学者而言,可能需要花费一些时间来...

    JavaScript (2)

    文件名称"就业指导之面试题解析篇"暗示了这篇文章可能包含了一些常见的JavaScript面试问题和解答,这些问题可能涉及数据类型、作用域、this指向、原型与继承、函数的特性(如call、apply、bind)等。博主可能还分享...

    JavaScript中this指向.docx

    ### JavaScript中this指向详解...通过上述分析可以看出,`this`的指向规则多样,但只要掌握了基本原理和场景,就能够灵活应对各种编程需求。希望本文能帮助大家更好地理解和运用`this`关键字,提升JavaScript编程水平。

    JS call()及apply()方法使用实例汇总

    在代码实践的过程中,理解call()和apply()方法的工作原理和使用场景对于编写出高质量的JavaScript代码是非常重要的。通过上面的分析和示例代码的展示,我们应该能够更深刻地理解它们在JavaScript编程中的重要性,并...

    javascript

    14. **`call`与`apply`方法**:对比分析`call`和`apply`方法的异同,并举例说明它们的应用场景。 15. **原型链**:解析原型链的工作原理及其实现机制。 16. **继承与封装**:讨论JavaScript中的继承方式,如原型...

    详解javascript中的this对象.pdf

    然而,`this` 在 JavaScript 中的行为并不像在其他一些静态类型的面向对象语言中那样直观,这经常导致初学者和经验丰富的开发者都感到困惑。 ### 示例分析 首先,让我们通过几个示例来理解 `this` 的工作原理: 1...

    JavaScript中的this原理及6种常见使用场景详解

    3. **构造函数**:在构造函数中使用`new`关键字创建新对象时,`this`指向新创建的对象。 4. **`apply()`和`call()`**:这两个方法可以显式地设置`this`的值,它们接受一个参数,这个参数会成为`this`在函数内部的值...

    JavaScript_天天造轮子手写面试常见源码.zip

    9. **事件与事件处理**:JavaScript中的事件模型包括事件冒泡和事件捕获,了解`addEventListener`和`removeEventListener`的用法,以及`event`对象中的`target`、`currentTarget`等属性。 10. **性能优化**:理解V8...

    深化理解Javascript中this的作用域_.docx

    5. **`call`、`apply`和`bind`方法**:这些方法允许我们显式地设置`this`的值。它们分别接收一个参数,用于指定`this`的值,然后调用函数。 6. **事件处理程序**:在事件处理程序中,`this`通常指向触发该事件的...

    程式导师实验计划第三期_JavaScript_下载.zip

    理解原型链、继承(如通过call、apply、bind方法或ES6的extends关键字实现)、封装和多态是提升JavaScript编程能力的关键。 三、作用域与闭包 JavaScript的作用域规则对于代码的组织和运行至关重要。全局作用域、...

    javaScript深入大纲

    - apply/call/bind调用:改变函数内部的`this`指向。 - 立即执行函数表达式:自执行函数。 - 通过事件处理程序调用。 - 使用`eval()`调用。 3. **ES6箭头函数** - 简化语法。 - `this`绑定行为。 4. **函数...

    js代码-apply/call/bind的例子(带参数)

    在压缩包中,`main.js` 文件可能包含了一些使用了 `apply()`, `call()`, 或 `bind()` 的示例代码,而 `README.txt` 文件可能解释了这些示例的用途和工作原理。通过分析这两个文件,你可以更深入地理解这三个方法的...

    深入理解JavaScript系列

    - **显式绑定**:使用`.call()`, `.apply()`, `.bind()`来显式指定`this`的值。 - **新绑定**:使用`new`关键字创建对象实例时,`this`指向新创建的对象。 #### 十四、作用域链(Scope Chain) 作用域链是在...

Global site tag (gtag.js) - Google Analytics