call(),apply()和bind()的区别
javascript中的每一个Function对象都有一个apply()和一个call()方法,它们的语法分别是:
/*apply()方法*/
function.apply(thisObj[, argArray])
apply: 调用一个对象的一个方法,用另一个对象替换当前对象。 例如: B.apply(A,arguments); 即A对象应用B对象的方法。
/*call()方法*/
function.call(thisObj[, arg1[, arg2[, [,...argN]]]]);
call: 调用一个对象的一个方法,用另一个对象替换当前对象。 例如:B.call(A,args1,args2);即A对象调用B对象的方法。
相同点:
1.方法的含义是一样的,功能自然也是一样的;
2.第一个参数的作用是一样的。
不同点:两者传入的列表形式不一样
1.call可以传入多个参数
2.apply只能传入两个参数,所以器第二个参数往往是作为数组的形式传入。
意义:
实现(多重)继承
实例代码:
function sum(num1,num2){
return num1+num2
}
function sub(num1,num2){
return num1-num2
}
var a1 = sum.apply(sub,[4,2]) // sub调用sum内的方法
console.log(a1) // 6
var a2 = sub.apply(sum,[4,2]) // sum调用sub内部的方法
console.log(a2) // 2
var c1 = sum.call(sub,4,2) // sub调用sum的方法
console.log(c1) // 6
var c2 = sub.call(sum,4,2) // sum调用sub内部的方法
console.log(c2) // 2
window.color = 'red';
var o = {color:'blue'}
function sayColor(){
console.log(this)
console.log(this.color)
}
console.log(this) // window
sayColor.call(this) // window red
sayColor.call(window) // window red
sayColor.call(o) // {color:'blue'} blue
sayColor.apply(this) // window red
sayColor.apply(window) // window red
sayColor.apply(o) // {color:'blue'} blue
实现继承
function Animal(name){
this.name = name
this.showName = function(){
console.log(this.name)
}
}
function Cat(name){
Animal.apply(this,[name])
}
var cat = new Cat("猫")
cat.showName() //猫
// 多继承
function Sum(){
this.sumadd = function(a,b){
console.log(a+b)
}
}
function Sub(){
this.subadd = function(a,b){
console.log(a-b)
}
}
function Js(){
console.log(this) //Js {}
Sum.apply(this)
Sub.apply(this)
}
var a = new Js();
a.sumadd(3,1) //4
a.subadd(3,1) //2
/*bind()方法*/
bind() 这个方法会创建一个函数实例,其this值会被绑定到传给bind()函数的值
var objSayColor = sayColor.bind(o) //{color:'blue'}
objSayColor() // blue
var a = {
user: 'skl',
}
var b = function(e,d,f){
console.log(this.user) //skl
console.log(e,d,f) //10,1,2
};
var c = b.bind(a,10)
c(1,2)
总结:call和apply都是改变上下文中的this并立即执行这个函数,bind方法可以让对应的函数想什么时候调就什么时候调用,并且可以将参数在执行的时候添加,这是它们的区别,根据自己的实际情况来选择使用。
call(),apply()和bind()的区别的更多相关文章
- JS 中的this指向问题和call、apply、bind的区别
this的指向问题 一般情况下this对象指向调用函数的对象,全局环境中执行函数this对象指向window. function a(){ console.log(this); //输出函数a中的th ...
- this+call、apply、bind的区别与使用
http://www.ruanyifeng.com/blog/2018/06/javascript-this.html https://segmentfault.com/a/1190000018017 ...
- 改变this指针的apply,call,bind的区别
apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. Jav ...
- js中call、apply和bind的区别
在JS中,这三者都是用来改变函数的this对象的指向的,他们有什么样的区别呢.在说区别之前还是先总结一下三者的相似之处:1.都是用来改变函数的this对象的指向的.2.第一个参数都是this要指向的对 ...
- call和apply和bind的区别
在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. JavaScript 的一大 ...
- 有关call和apply、bind的区别及this指向问题
call和apply都是解决this指向问题的方法,唯一的区别是apply传入的参数除了其指定的this对象之外的参数是一个数组,数组中的值会作为参数按照顺序传入到this指定的对象中. bind是解 ...
- Javascript中call,apply,bind的区别
一.探索call方法原理 Function.prototype.call = function(obj) { // 1.让fn中的this指向obj // eval(this.toString().r ...
- JS中call()和apply()以及bind()的区别
一.方法定义: apply:调用一个对象的一个方法,用另一个对象替换当前对象.例如:B.apply(A, arguments);即A对象应用B对象的方法. call:调用一个对象的一个方法,用另一个对 ...
- 超容易理解的call()、apply()、bind()的区别
call().apply().bind()是用来改变this的指向的. 一 举个例子 一个叫喵喵的猫喜欢吃鱼,一个叫汪汪的小狗喜欢啃骨头,用代码实现如下: 有一天,小狗汪汪和喵喵共进午餐的时候,汪汪说 ...
- apply,all,bind的区别
这三个都是用来改变this指向的 call() 和apply()的第一个参数相同,就是指定的对象.这个对象就是该函数的执行上下文.call()和apply()的区别就在于,两者接收的参数不一样.cal ...
随机推荐
- Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3) D. Barcelonian Distance 几何代数(简单)
题意:给出一条直线 ax +by+c=0 给出两个整点 (x1,y1) (x2,y2) 只有在x,y坐标至少有一个整点的时 以及 给出的直线才有路径(也就是格子坐标图的线上) 问 两个整点所需要 ...
- 工厂模式如何返回Spring的Bean
工厂返回的可以是一个具体的对象,比如造一辆车,可以返回一个自行车对象,或者汽车对象. 但是在Spring 中需要工厂返回一个具体的Service,这就是一个抽象工厂了 一种方法是反射,个人觉得这种方式 ...
- HTML&CSS_基础04
一.常见的选择器 1. 元素选择器 选择页面中指定的元素 2. id选择器 语法:#id属性值{} 3. 类选择器 语法:.class属性值{} 可以为同一个元素设置多个属性值,多个值之间用空格隔开 ...
- 如何对mRemoteNG在进行Linux终端访问时自定义配色
Its not that easy to config mRemoteNG custom color themes, not like XShell which is really convinent ...
- MySQL表与表之间的关系
表与表之间的关系 表1 foreign key 表2 则表1的多条记录对应表2的一条记录,即多对一 利用foreign key的原理我们可以制作两张表的多对多,一对一关系 多对多: 表1的多条记录可以 ...
- 小白月赛13 小A与小B (双向BFS)
链接:https://ac.nowcoder.com/acm/contest/549/G来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...
- Zabbix监控磁盘IO值
iostat取硬盘IO值. iostat -x 3 2 | grep vdb | sed -n '2p' | awk '{print $14}' 每3s取一次值,输出第二次vdb硬盘的负载值. 添加Z ...
- mac与windows共享键盘鼠标(synergy)
桌面上有两台电脑, 一台mac一台windows, 由于桌面空间紧张, 放两套键盘鼠标有点浪费空间, 如果能让mac和windows共享键盘鼠标就好了, 经过一番搜寻, 找到了一款名为synergy的 ...
- Flash设置(各种版本浏览器包括低版本IE)
涉及到的各种版本flash百度下都能下到的,不再说明. Flash的安装比较麻烦,涉及多种浏览器.多种操作系统支持,安装.设置的地方比较多,以下说明基本涉及大部分安装过程中可能遇到的问题,如果安装或视 ...
- codeforces-1133 (div3)
A.先全部化成分钟数,取平均数之后化成正常时刻. #include <map> #include <set> #include <ctime> #include & ...