一、作用:
call、apply、bind 作用是改变函数执行的上下文,简而言之就是改变函数运行时的this指向
二、区别
call:
1. 传入的参数不固定
2.第一个参数是this绑定的对象,后面其余的参数是传入函数执行的参数列表
3. 第一个参数为null、undefined的时候,默认指向window
4. 改变this指向后原函数会立即执行,且此方法之时临时改变this一次
apply:
1.接收两个参数
2.第一个参数是this绑定的对象,第二个参数是函数接受的参数,以数组的形式传入
3. 第一个参数为null、undefined的时候,默认指向window
4. 改变this指向后原函数会立即执行,且此方法之时临时改变this一次
bind:
1. 传入的参数不固定
2.第一个参数是this绑定的对象,后面其余的参数是传入函数执行的参数列表(但这个列表可以分多次传入)
3.第一个参数为null、undefined的时候,默认指向window
4. 改变this指向后不会立即执行,而是返回一个永久改变this指向的函数
5. 多个连续bind,最后this指向第一次调用bind方法的参数决定
function fn (...args){console.log(this,args)}let obj = {name:'张三'}let obj2 = {name:'张三2'}// apply改变this指向,会立即执行fn.apply(obj,[1,2]) // {name:'张三'} [1,2]fn([3,4]) // window// call改变this指向,会立即执行fn.call(obj,5,6) // {name:'张三'} [5,6]fn() //window// bind改变this指向,不会立即执行,需要手动调用,参数可分多次传入,多次bind,this指向第一个对象const fn1 = fn.bind(obj,5,6).bind(obj2,7,8)fn1() // {name:'张三'} [5,6,7,8]fn1(9,0) // {name:'张三'} [5,6,7,8,9,0]
三、手写实现call、bind、apply 函数
手写call、bind、apply