手写call
方法一:ES6
Function.prototype.call2 = function (context, ...args) {
context = context || globalThis;
const _symbol = Symbol();
context[_symbol] = this;
let result = context[_symbol](...args);
delete context[_symbol];
return result;
}
方法二:ES5
Function.prototype.call3 = function (context) {
context = context || globalThis;
const _symbol = Symbol();
context[_symbol] = this;
let args = [];
for (let i = 1, len = arguments.length; i < len; i++) {
args.push('arguments[' + i + ']');
}
//使用eval,args会直接调用toString()
let result = eval('context[_symbol](' + args + ')');
delete context[_symbol];
return result;
}