最简单的 bind 一行就可以实现,而在实际面试过程中也不会考察你太多的边界条件
Function.prototype.fakeBind = function (obj, ...args) {
return (...rest) => this.call(obj, ...args, ...rest);
};
测试一下
function f(arg) {
console.log(this.a, arg);
}
// output: 3, 4
f.bind({ a: 3 })(4);
// output: 3, 4
f.fakeBind({ a: 3 })(4);
再抄一个加强版的 《JavaScript 权威指南》P191 ES3 实现 bind
if (!Function.prototype.bind) {
Function.prototype.bind = function(o /*, args */) {
var self = this, boundArgs = arguments;
return function () {
var i, args = [];
for (i = 1; i < boundArgs.length; i++) {
args.push(boundArgs[i])
}
for (i = 0; i < arguments.length; i++) {
args.push(arguments[i])
}
return self.apply(o, args)
}
}
}