bind、call、apply区别?如何实现?
一、作用:
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 函数