如何用apply实现一个bind?

摘要:面试题:如何用apply实现一个bind?bind函数在 ES5 才被加入,所以并不是所有浏览器都支持,IE8及以下的版本中不被支持,如果需要兼容可以使用 Polyfill 来实现。 bind方法与call/apply最大的区别就是bind返回一个绑定上下文的函数

面试题:

如何用apply实现一个bind?


bind说明

bind函数在 ES5 才被加入,所以并不是所有浏览器都支持,IE8及以下的版本中不被支持,如果需要兼容可以使用 Polyfill 来实现。  

bind方法与call/apply最大的区别就是bind返回一个绑定上下文的函数,而call/apply是直接执行了函数,特性如下:

  • 可以指定this
  • 返回一个绑定了this的函数
  • 可以传参
  • 柯里化


代码

Function.prototype._bind = function(target) {
    // 保留调用_bind方法的对象
    let _this = this;
    // 接收保存传入_bind方法中的参数,等价于arguments.slice(1),除了第一个参数其余全视作传入参数
    let args = [].slice.call(arguments, 1)
    return function() {
        return _this.apply(target, args)
    }
}

let obj = {
    name: '测试员小陈'
}

// 测试函数
function test(args) {
    console.log('this:', this);
    console.log('我的名字:', this.name);
    console.log('我接收的参数:', args);
}

console.log(test._bind(obj, "I am args")); // output: [Function]

test._bind(obj, "I am args")()

/* 执行结果
*  this: { name: '测试员小陈' }
*  我的名字: 测试员小陈
*  我接收的参数: I am args
*/



本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://shenqiku.cn/article/FLY_7482