对于 js 中 bind 的理解

在阅读 《JavaScript 框架设计》 2rd 中,有一段代码不甚明了,烦请各位指教,以下是代码:

var bind = function(bind) {
    return {
        bind: bind.bind(bind),
        call: bind.bind(bind.call),
        apply: bind.bind(bind.apply)
    }
}(Function.prototype.bind)

var a = [1, [2, 3], 4],
    b = [5, 6]

var concat = bind.apply([].concat)

console.log(concat(b, a))     // [5, 6, 1, 2, 3, 4]

该段代码在原书的49页

阅读 2.3k
2 个回答

等同于

Function.prototype.bind.bind(Function.prototype.bind.apply)([].concat);

Function.prototype是个function
bind返回一个function并使this指向对应bind的第一个参数
所以最后就是
var concat=[].concat.apply了

过程大致可以理解为

Function.prototype.bind.bind(Function.prototype.bind.apply)([].concat);
消耗一个bind后并修改this 就成为
Function.prototype.bind.apply.bind([].concat)
再消耗一个bind修改this
[].concat.apply

Function.prototype.bind: 给某个对象,假如为obj绑定一个上下文
bind.bind(bind.apply):相当于得到了apply.bind
bind.apply([].concat):apply需要一个上下文,也就是这里的[].concat,得到[].concat.apply
concat(b, a):相当于是a.concat(b)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题