code: function bind$1(fn, context) {
    if (fn.bind) {
      return fn.bind(context);
    } else if (fn.apply) {
      return function __autobind__() {
        for (var _len2 = arguments.length, args = Array(_len2), _key3 = 0; _key3 < _len2; _key3++) {
          args[_key3] = arguments[_key3];
        }
  
        return fn.apply(context, args);
      };
    } else {
      return function __autobind__() {
        for (var _len3 = arguments.length, args = Array(_len3), _key4 = 0; _key4 < _len3; _key4++) {
          args[_key4] = arguments[_key4];
        }
  
        return fn.call.apply(fn, [context].concat(_toConsumableArray(args)));
      };
    }
  }
docs: bind the function with some context. we have some fallback strategy here
  @param {function} fn the function which we need to bind the context on
  @param {any} context the context object