当前位置: 首页 > 后端技术 > Node.js

JavaScript中call、apply、bind的用法和区别

时间:2023-04-03 14:44:21 Node.js

简介JavaScript中有Function.prototype.call()、Function.prototype.apply()和Function.prototype.bind()三个方法,可以是用于指定函数的this值。call()类似于apply(),它调用一个函数并指定函数的this值、thisArg和参数。不同的是call()是以arg1,arg2,...的形式传递参数,而apply()是以参数列表的形式传递参数。输入参数为数组形式[arg1,arg2,...]:function.call(thisArg,arg1,arg2,...)function.apply(thisArg,[arg1,arg2,...])bind()方法不同于前两种方法。它创建了一个新函数。调用新函数时,会调用原函数,并指定原函数的this值和参数。执行bind()时,不会调用任何函数。bind()传入参数的方式和call()一样,使用参数列表:fucntion.bind(thisArg,arg1,arg2,...)usagecall()使用call()调用父类构造函数来实现继承,也可以使用apply(),只是传递参数的方式略有不同://使用call实现继承varPet=function(name,age){this.name=namethis.age=age}varCat=function(name,age,color){Pet.call(this,name,age)this.color=color}varcat=newCat('Garfield',1,'orange')console.log(cat.name)//加菲猫控制台。log(cat.age)//1console.log(cat.color)//orange//使用apply实现继承:varDog=function(name,age,size){Pet.apply(this,[name,age])this.size=size}当调用一个对象的方法时,方法中的this指向对象本身,使用call()改变方法的this值:varutils={setName:function(name){this.name=name}}//使用call在setName中指定this指向自己varPerson=function(name){utils.setName.call(this,name)}varp=newPerson('John')console.log(p.name)//'John'apply()apply()方法除了指定函数的this值外,还可以用来传递参数。例如,Math.max()允许传入多个参数,要找到它们的最大值,可以使用apply()方法将数组元素作为参数传递给Math.max()方法://使用寻找最大值的循环varnumbers=[1,0,0,8,6],max=-Infinityfor(vari=0;i{console.log(this.a)}}addEvent()fakeDom.onClick()//'fakeDom'fakeDom.onClickBind()//'addEvent'fakeDom.onClickArrow()//'addEvent'使用bind()绑定参数后,新函数只需要传入剩下的参数:varadd=function(a,b){returna+b}varadd5=add.bind(null,5)console.log(add5(3))//8