call、apply、bind 作用是改变函数执行时的上下文,简而言之就是改变函数运行时的 this 指向

区别 

apply

apply 接受两个参数,第一个参数是 this 的指向,第二个参数是函数接受的参数,以数组的形式传改变 this 指向后原函数会立即执行,且此方法只是临时改变 this 指向一次
当第一个参数为 null、undefined 的时候,默认指向 window(在浏览器中)

call

call 方法的第一个参数也是 this 的指向,后面传入的是一个参数列表
跟 apply 一样,改变 this 指向后原函数会立即执行,且此方法只是临时改变 this 指向一次
同样的,当第一个参数为 null、undefined 的时候,默认指向 window(在浏览器中)

bind

bind方法和cal很相似,第一参数也是 this 的指向,后面传入的也是一个参数列表(但是这个参数列表可以分多次传入)
改变 this 指向后不会立即执行,而是返回一个永久改变 this 指向的函数
当然的,当第一个参数为 null、undefined 的时候,默认指向 window(在浏览器中)

不难看出三者之间的异同

  • apply、call、bind 都能起到改变函数的 this 对象指向的作用,且当第一个参数为 null,undefined 时,默认指向 window;但 bind 可以起到永久修改的作用
  • 三者都可以传参,但是 apply是数组,而call是参数列表,且apply和call 是一次性传入参数,而 bind 可以分为多次传入

bind 实现

Function.prototype.recodeBind = function (context) {
    if (typeof (context) !== 'function') {
        throw new TypeError('recodeBind needs to be a function');
    }

    const args = [...arguments].slice(1)
    const fn = this

    return function Fn() {
        return fn.apply(this instanceof Fn ? new Fn(...arguments) : context, args.concat(...arguments))
    }
}

 

posted on 2024-09-16 10:34  XiSoil  阅读(3)  评论(0编辑  收藏  举报