话不多说,先放代码:
ES6下,call 自己实现:
Function.pototype.mycall = function (context) {
context.myfunc = this;
let args = [...arguments].slice(1)
let result = context.myfunc(...args);
delete context.myfunc;
return result;
}
ES6下,apply 自己实现:
Function.prototype.myapply = function (context, arr) {
context = context ? Object(context) : window;
context.fn = this;
let result;
if (!arr) {
result = context.fn();
} else {
result = context.fn(...arr);
}
delete context.fn
return result;
}
但是这是有问题的实现:
聪明的你是否看出其中的问题:
没错, 我们假设传进来的 context没有fn属性,否则会产生其它的副作用。
怎么解决?
Function.pototype.mycall = function (context) {
// 判断context的合理性
context = context ? Object(context) : window;
// 保证 context 没有 myfunc属性
let myfunc = Symbol();
context[myfunc] = this;
let args = [...arguments].slice(1)
let result = context.myfunc(...args);
delete context.myfunc;
return result;
未完待续------