call,apply,bind

llz大约 1 分钟

call

call可以改变函数内部this的指向,并且会立即执行函数,第一个参数是要指定的this值,之后的参数就是函数调用时所需的参数,格式为arg1,arg2...

 const obj={
	 name:'rice',
	 fun(){
		 console.log(this)
	 }
 }

 function fun2(x,y){
	 console.log(this,x,y)
	 return x+y
 }

 //obj里面的fun函数的this指向变成了window
 obj.fun.call(this)
 
 // fun2 的this指向变成了obj对象,把1和2传给函数,返回值就是原函数的返回值
 const sum=fun2.call(obj,1,2) 

 console.log(sum) //3

apply

apply 功能和call类似,也会立即执行函数,区别就是apply的第二个参数要以数组 [arg1,arg2,...] 的形式传递

 //obj里面的fun函数的this指向变成了window
 obj.fun.apply(this)

 // fun2 的this指向变成了obj对象,参数要以数组的形式传递
 fun2.apply(obj,[1,2])

bind

bind不会调用函数,会返回一个改变了this指向的新函数,可以手动调用该新函数

//bind 不会执行函数,会返回一个改变了this指向的新函数
const fun3=fun2.bind(this,1,2)

fun3()

相同点与区别

  • 相同点
  1. 都可以改变函数内部this的指向;
  • 区别
  1. callapply 会直接调用函数,bind不会调用函数,而是返回一个新函数;

  2. call bindapply 传递的参数格式不一样,callbind 传递的参数格式为 arg1,arg2... ,apply参数格式必须是数组格式 [arg1,arg2,...];

上次编辑于: