SOURCE

Function.prototype.mybind = function(context) {
  // 调用mybind的时候 传递的参数
    var outerArg = Array.prototype.slice.call(arguments, 1)
    var _this = this;

    // 标准浏览器  这里比较难理解
    // if ("bind" in Function.prototype) {
    //     // 传递进来的参数传递过bind, 还需要将bind的this指正
    //     return this.bind.apply(this,[context].concat(outerArg))
    // }
    // 兼容化处理
    function _fn() {
        var innerArg = Array.prototype.slice.call(arguments)
        // 将默认传递的参数传递进入
        if (innerArg.length==0) {
            innerArg.push(window.event);
        }
        var arg = outerArg.concat(innerArg)
        _this.apply(context, arg)
    }
    return _fn;
}

var obj = {a:1, b:2}
function test(num1, num2) {
  console.log(this, num1+num2)
}
var fn = test.mybind(obj, 10)
fn(23)

// 完整版
  function bind(callback, context) {
      // 考虑传递的参数问题
      var ourterArg = Array.prototype.slice.call(arguments, 2)
      context = context || window;
      function _fn() {
          var innerArg = Array.prototype.slice.call(arguments)
          console.log(innerArg) // MouseEvent
          callback.apply(context, outerArg.concat(innerArg))
      }
      return _fn;
  }
console 命令行工具 X clear

                    
>
console