function wrap(fn) {
switch (fn.length) {
case 0:
return function() {
return fn.call(this)
}
case 1:
return function() {
return fn.call(this, this)
}
case 2:
return function(a1) {
return fn.call(this, this, a1)
}
case 3:
return function(a1, a2) {
return fn.call(this, this, a1, a2)
}
case 4:
return function(a1, a2, a3) {
return fn.call(this, this, a1, a2, a3)
}
default:
return function() {
const args = [this]
for (let i = 0, len = arguments.length; i < len; i++) {
args[i + 1] = arguments[i]
}
return fn.apply(this, args)
}
}
}
var f0 = wrap(function() { console.log(Date.now()) })
var f1 = wrap(function(a) { console.log(Date.now(), a) })
var f2 = wrap(function(a, b) { console.log(Date.now(), a, b) })
var f3 = wrap(function(a, b, c) { console.log(Date.now(), a, b, c) })
var f4 = wrap(function(a, b, c, d) { console.log(Date.now(), a, b, c, d) })
var f5 = wrap(function(a, b, c, d, e) { console.log(Date.now(), a, b, c, d, e) })