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   XiSoil  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类



点击右上角即可分享
微信分享提示