实现 Function.prototype.bind 方法
function bind (fn, obj) {
var args = []
for (var i = 2; i < arguments.length; i++) {
args.push(arguments[i])
}
return function () {
for (var i = 0; i < arguments.length; i++) {
args.push(arguments[i])
}
return apply(fn, obj, args)
}
}
实现 Function.prototype.apply 方法
function apply (fn, obj, args) {
const tmpFn = String(new Date().getTime())
Object.defineProperty(obj, tmpFn, {
configurable: true,
enumerable: false,
writable: false,
value: fn
})
var statement = 'obj[tmpFn]('
for (var i = 0; i < args.length; i++) {
statement += 'args[' + i + '], '
}
if (i > 0) {
statement = statement.slice(0, -2)
}
statement += ')'
var result = eval(statement)
delete obj[tmpFn]
return result
}
实现 Function.prototype.call 方法
function call (fn, obj) {
var args = []
for (var i = 2; i < arguments.length; i++) {
args.push(arguments[i])
}
return apply(fn, obj, args)
}