js的call和apply拾遗
一.产生背景
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拾遗的更多相关文章
- js继承之call,apply和prototype随谈
在js中,call,apply和prototype都可以实现对象的继承,下面我们看一个例子: function FatherObj1() { this.sayhello = "I am jo ...
- js中call和apply的实现原理
js中call和apply的实现原理 实现call的思路: /* 还有就是call方法是放在Function().prototype上的也就是构造函数才有的call方法 (我门可 ...
- 使用JS简单实现一下apply、call和bind方法
使用JS简单实现一下apply.call和bind方法 1.方法介绍 apply.call和bind都是系统提供给我们的内置方法,每个函数都可以使用这三种方法,是因为apply.call和bind都实 ...
- JS中 call() 与apply 方法
1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...
- js基础篇——call/apply、arguments、undefined/null
a.call和apply方法详解 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象 ...
- 区别和详解:js中call()和apply()的用法
1.关于call()和apply()的疑点: apply和call的区别在哪里 什么情况下用apply,什么情况下用call apply的其他巧妙用法(一般在什么情况下可以使用apply) 2.语法和 ...
- JS中call和apply
作用: 替换当前对象的方法中的this. 理解: call和apply是为了动态改变this出现的,当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作 ...
- js里function的apply vs. bind vs. call
js里除了直接调用obj.func()之外,还提供了另外3种调用方式:apply.bind.call,都在function的原型里.这3种方法的异同在stackoverflow的这个答案里说的最清楚, ...
- (转)js的call和apply
1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...
随机推荐
- Android-第三天
今天开始做一个提交的页面,本来是用LinearLayout,但是这种布局要使用到多组LinearLayout,于是采用表格布局+相对布局的方式. <TableLayout> <Tab ...
- git 简单入门
首先了解一下git的是什么: [百度百科解释]Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理.[2] Git 是 Linus Torvalds 为了帮助管理 ...
- sqlserver 字符串截取与拼接
update yanan set name=name+right(phone,4) where id=56 其中right(phone,4)是截取手机号后四位,left是从左开始截取.name=nam ...
- 译-HTTP-GET HTTP-POST SOAP protocol for ASP.NET services的异同
参考 http://stackoverflow.com/questions/4646146/http-soap-get-post https://support.microsoft.com/en-us ...
- Oracle 视图 (待更新, 缓存)
参考: 视图.索引.存储过程优缺点: http://www.cnblogs.com/SanMaoSpace/p/3147059.html oracle视图总结(转):http://tianwei013 ...
- js实现最短时间走完不同速度的路程
题目: 现在有一条公路,起点是0公里,终点是100公里.这条公路被划分为N段,每一段有不同的限速.现在他们从A公里处开始,到B公里处结束.请帮他们计算在不超过限速的情况下,最少需要多少时间完成这段路程 ...
- springMVC注解方式+easyUI+MYSQL配置实例
刚接触springMVC,使用的注解方式,也在学习阶段,所以把自己学习到的记下来.本文利用springMVC从数据库读取用户信息为例,分享一下. 1.准备相关架包及资源.因为使用springMVC+e ...
- 定时任务schedule(spring boot )
1. 定时任务实现方式:SpringBoot自带的Scheduled,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多,本文主要介绍. 执行方式:单线程(串行)多线程(并行) ...
- DAY10-万物皆对象-2018-2-2
许久没有写了,虽然每天都有在学,但是学的东西也少了,后面难度慢慢加大,学习速度也是变慢了.这是许多天积累下来的笔记,从第一次接触对象,到慢慢去了解,现在处于还待深入了解的状态.万物皆对象,那是不是说没 ...
- Redis Crackit漏洞防护
Redis Crackit漏洞利用和防护 注意:本文只是阐述该漏洞的利用方式和如何预防.根据职业道德和<中华人民共和国计算机信息系统安全保护条例>,如果发现的别人的漏洞,千万不要轻易入侵, ...