丁鹿学堂:前端面试this指向(二)

bind改变this指向

bind可以改变this的指向。bind()方法会创建一个函数的实例,其 this 值会被绑定到传给 bind()函数的值。也就是说 bind() 会返回一个新函数。不太好理解,上代码就知道了。

let name = 123
function fn() {
  console.log(this)
}
fn()
let obj = {
  name:456
}
let fn2 = fn.bind(obj)
fn2()

这里如果调用fn,this指向的是window,而通过bind调用,传入的参数就是this的指向,而返回的新函数,功能和fn是一模一样的,执行的代码依旧是原函数内部代码,只不过修改了this指向。
所以调用以后,fn2的this指向的就是obj

注意:

箭头函数中的this不会被改变,即使用bind去绑定也不会变。
bind只是返回了一个函数,本身是不会执行函数的,需要再次自己手动去调用。

call和apply改变this指向

call()方法与 apply()方法的作用相同,它们的唯一区别在于接收参数的方式不同。在使用call()方法时,传递给函数的参数必须逐个列举出来。
call和apply会直接调用函数,并且修改this指向为传入的第一个参数

let obj1 = {
  name:'zhangsan',
  clg(){
    console.log(this.name)
  }
}
let obj2 = {
  name:'lisi'
}
obj1.clg() 
obj1.clg.call(obj2)

注意:
call和apply的区别
call传的第二个,第三个参数是原来函数的形参,而apply第二个参数是原来形参组成的数组。

  • 参数数量,顺序确定就用call,参数数量,顺序不确定就用apply
  • 参数数量少用call,参数数量多用apply
  • 参数集合已经是一个数组的情况,最好用apply

你可能感兴趣的:(前端培训丁鹿学堂分享站,前端,javascript,开发语言)