一.产生背景

  1. JavaScript 的函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念

  2.正因为上下文的不同所以call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向。

二.定义

每个函数都包含两个非继承而来的方法:apply()和call().这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内的this对象的值.

首先apply

apply([thisObj[,argArray]])    应用某一对象的一个方法,用另一个对象替换当前对象。

方法接收两个参数:一个是其中运行的函数的作用域,拎一个是参数数组,其中第二个参数可以是Array的实例也可以是arguments对象,callee,caller;

 如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。

可以用来代替另一个对象调用一个方法。apply方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

其次,call

call([thisObj[,arg1[, arg2[, [,.argN]]]]])调用一个对象的一个方法,以另一个对象替换当前对象。

这两个方法,如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

三.常用实例

<script>
//1执行代码块
function add(a,b){
alert(a+b)
}
function sub(a,b){
alert(a-b)
}
sub.apply(add,[2,2]) //0 js 中的函数其实是对象,函数名是对 Function 对象的引用,add继承了sub的方法并执行
add.call(sub,2,2)//4 sub继承了add的方法并执行 //2执行代码
function Animal(){
this.name="Animal";
this.showName=function(){
alert(this.name)
}
}
function Cat(){
this.name="Cat"
}
var animal = new Animal();
var cat = new Cat();
animal.showName.call(Cat)//通过call或apply将animal的showName方法放到Cat上来执行,this指向Cat所以 this.name="Cat"
//3实现继承js代码块
function Animal(name){
this.name = name;
this.showName = function(){
alert(this.name);
}
} function Cat(name){
Animal.call(this,name)
}
var cat = new Cat("Blace Cat")
cat.showName();
// Animal.call(this,name) 将Animal对象的方法放到this对象环境下执行 ;那么this就有了Animal的方法和属性
//4多重继承
function Class10() {
this.showSub = function(a,b) {
alert(a-b);
}
}
function Class11() {
this.showAdd = function(a,b) {
alert(a+b);
}
}
function Class2(){
Class10.call(this);
Class11.call(this);
} var classTest=new Class2();
classTest.showAdd(10,10);
//Class2中使用了两个call实现了将Class10和Class11对象上的方法放到this即Class2环境下执行
</script>

js的call和apply拾遗的更多相关文章

  1. js继承之call,apply和prototype随谈

    在js中,call,apply和prototype都可以实现对象的继承,下面我们看一个例子: function FatherObj1() { this.sayhello = "I am jo ...

  2. js中call和apply的实现原理

    js中call和apply的实现原理            实现call的思路: /* 还有就是call方法是放在Function().prototype上的也就是构造函数才有的call方法 (我门可 ...

  3. 使用JS简单实现一下apply、call和bind方法

    使用JS简单实现一下apply.call和bind方法 1.方法介绍 apply.call和bind都是系统提供给我们的内置方法,每个函数都可以使用这三种方法,是因为apply.call和bind都实 ...

  4. JS中 call() 与apply 方法

    1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...

  5. js基础篇——call/apply、arguments、undefined/null

    a.call和apply方法详解 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象 ...

  6. 区别和详解:js中call()和apply()的用法

    1.关于call()和apply()的疑点: apply和call的区别在哪里 什么情况下用apply,什么情况下用call apply的其他巧妙用法(一般在什么情况下可以使用apply) 2.语法和 ...

  7. JS中call和apply

    作用: 替换当前对象的方法中的this. 理解: call和apply是为了动态改变this出现的,当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作 ...

  8. js里function的apply vs. bind vs. call

    js里除了直接调用obj.func()之外,还提供了另外3种调用方式:apply.bind.call,都在function的原型里.这3种方法的异同在stackoverflow的这个答案里说的最清楚, ...

  9. (转)js的call和apply

    1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...

随机推荐

  1. linux 中nvme 的中断申请及处理

    /** * struct irq_desc - interrupt descriptor * @irq_data: per irq and chip data passed down to chip ...

  2. 使用mui框架----移动端页面在所有屏幕下自适应

    写移动端怎么会不用到框架呢? 现在比较火的是mui.amaze UI 之类的,mui是现在最灵活轻便的一个框架,能够从pc到移动灵活的自适应, 只需要调用他定义的类名就能使用,非常方便,只是需要自己来 ...

  3. 重温MFC

    1. Button控件 2. 旋转和高级编辑控件 3. 标签控件和属性页 4. 列表控件 5. 树控件 6. 进度条控件和滑动条控件 7. 滚动条 8.工具栏和状态栏

  4. awk解决实际问题例子

    awk很有用,就不说了,下面记录几个我遇到的例子,汇总 1 获得linux环境变量(ENVIRON) awk 'BEGIN{print ENVIRON["PATH"];}' /et ...

  5. C语言学习之递归

    学习C语言到递归时,还记得那个用来抛砖引玉的例子: "从前呀,有座山,山里有个老和尚给一个小和尚讲故事,讲的什么故事呢?从前呀,有座山,山里有个老和尚给一个小和尚讲故事,讲的什么故事呢?从前 ...

  6. js给页面添加滚动事件并判断滚动方向

    <script> var scrollFunc = function (e) { var direct = 0; e = e || window.event; if (e.wheelDel ...

  7. OSSEC初探

    OSSEC初探 概念: OSSEC是一款开源的基于主机的入侵检测系统(HIDS),它可以执行日志分析.完整性检验.windows注册表监控.隐匿性检测和实时告警.它可以运行在各种不同的操作系统上,包括 ...

  8. C#在winform中读写ini文件

    class WY_INI { static string IniFileName; static char[] TrimChar = { ' ', '\t' }; public string[] Ge ...

  9. @RequestMapping注解

    Spring MVC中用于参数绑定的注解有很多,都在org.springframework.web.bind.annotation包中,根据它们处理的request的不同内容部分可以分为四类(主要讲解 ...

  10. JAVA多线程之先行发生原则

    一.引子 如果java内存模型中所有的有序性都仅仅依靠volatile和synchronized来完成,那么有一些操作会变得很繁琐,但我们在编写java并发代码时并未感觉到这一点,这是因为java语言 ...