不同的定义
- JavaScript函数或者说是对象中定义的函数可以动态的绑定到另一个函数中,即即使函数f2中未定义函数f1中的子函数ff1,f2也可以调用ff1,apply与call可以实现这种用法。
- JavaScript对apply和call的解释是:使用指定对象替换当前对象并调用函数。
- 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方法是JavaScript编程中非常重要的概念,这两者都是函数对象的方法,用于在特定的作用域中执行函数,并可以指定函数体内this的指向。从JQuery源码中分析apply和call方法,...
在JavaScript中,`apply()`和`call()`是两种非常重要的函数调用方式,它们都是用于改变函数执行时的上下文,即改变`this`的指向。这两种方法的主要区别在于它们接收参数的方式,但最终目的都是为了让函数能在不同的...
了解并掌握 `call` 和 `apply` 的使用,能帮助开发者更好地理解和编写JavaScript代码,尤其在处理对象方法、函数封装、参数传递等场景中。同时,理解`this`、`arguments` 和 `callee` 的工作原理也是提升JavaScript...
在JavaScript中,`call()`, `apply()`, 和 `bind()` 是三个非常重要的函数,它们都与函数调用有关,但各自有不同的应用场景。本文将深入探讨这三个函数的实现原理及其使用方式。 首先,`call()` 函数允许我们调用一...
下面我们将深入探讨`this`的使用和一些常见场景。 1. **基本理解**: `this`的值取决于函数调用的方式。在JavaScript中,`this`可以指向以下四种情况之一: - **全局或函数外部**:在全局作用域中,`this`指向`...
在JavaScript中,`Function.prototype.call` 和 `Function.prototype.apply` 是两种非常重要的方法,它们都是用来改变函数调用时的上下文(即`this`值)以及传递参数。在这个特殊的面试题中,这两种方法被结合在一起...
通过以上的分析,我们了解了`new`操作符在JavaScript中的工作原理,包括如何创建新对象、设置原型链、绑定`this`上下文以及返回新对象。这些知识对于深入理解和使用JavaScript的面向对象编程至关重要。
通过上述分析,我们可以看到`this`在JavaScript中的重要性和灵活性。正确理解和运用`this`,能够帮助开发者更好地掌握JavaScript的面向对象编程,从而在项目开发中游刃有余。对于初学者而言,可能需要花费一些时间来...
文件名称"就业指导之面试题解析篇"暗示了这篇文章可能包含了一些常见的JavaScript面试问题和解答,这些问题可能涉及数据类型、作用域、this指向、原型与继承、函数的特性(如call、apply、bind)等。博主可能还分享...
### JavaScript中this指向详解...通过上述分析可以看出,`this`的指向规则多样,但只要掌握了基本原理和场景,就能够灵活应对各种编程需求。希望本文能帮助大家更好地理解和运用`this`关键字,提升JavaScript编程水平。
在代码实践的过程中,理解call()和apply()方法的工作原理和使用场景对于编写出高质量的JavaScript代码是非常重要的。通过上面的分析和示例代码的展示,我们应该能够更深刻地理解它们在JavaScript编程中的重要性,并...
14. **`call`与`apply`方法**:对比分析`call`和`apply`方法的异同,并举例说明它们的应用场景。 15. **原型链**:解析原型链的工作原理及其实现机制。 16. **继承与封装**:讨论JavaScript中的继承方式,如原型...
然而,`this` 在 JavaScript 中的行为并不像在其他一些静态类型的面向对象语言中那样直观,这经常导致初学者和经验丰富的开发者都感到困惑。 ### 示例分析 首先,让我们通过几个示例来理解 `this` 的工作原理: 1...
3. **构造函数**:在构造函数中使用`new`关键字创建新对象时,`this`指向新创建的对象。 4. **`apply()`和`call()`**:这两个方法可以显式地设置`this`的值,它们接受一个参数,这个参数会成为`this`在函数内部的值...
9. **事件与事件处理**:JavaScript中的事件模型包括事件冒泡和事件捕获,了解`addEventListener`和`removeEventListener`的用法,以及`event`对象中的`target`、`currentTarget`等属性。 10. **性能优化**:理解V8...
5. **`call`、`apply`和`bind`方法**:这些方法允许我们显式地设置`this`的值。它们分别接收一个参数,用于指定`this`的值,然后调用函数。 6. **事件处理程序**:在事件处理程序中,`this`通常指向触发该事件的...
理解原型链、继承(如通过call、apply、bind方法或ES6的extends关键字实现)、封装和多态是提升JavaScript编程能力的关键。 三、作用域与闭包 JavaScript的作用域规则对于代码的组织和运行至关重要。全局作用域、...
- apply/call/bind调用:改变函数内部的`this`指向。 - 立即执行函数表达式:自执行函数。 - 通过事件处理程序调用。 - 使用`eval()`调用。 3. **ES6箭头函数** - 简化语法。 - `this`绑定行为。 4. **函数...
在压缩包中,`main.js` 文件可能包含了一些使用了 `apply()`, `call()`, 或 `bind()` 的示例代码,而 `README.txt` 文件可能解释了这些示例的用途和工作原理。通过分析这两个文件,你可以更深入地理解这三个方法的...
- **显式绑定**:使用`.call()`, `.apply()`, `.bind()`来显式指定`this`的值。 - **新绑定**:使用`new`关键字创建对象实例时,`this`指向新创建的对象。 #### 十四、作用域链(Scope Chain) 作用域链是在...