手撕 apply & call

手撕 apply & call

十月 14, 2020

前言

callapply的区别,应该在于API的使用上,call(context | null, args...)apply(context | null, [args...])

共同点在于都可以自调用函数硬绑定 上下文(this)

现在,开启手撕模式:

Sources

  • Call
1
2
3
4
5
6
7
8
9
Function.prototype.myCall = function (context) {
context = context || this;
context.fn = this
const _arr = Array.from(arguments);
_arr.shift()
const res = context.fn(_arr.toString());
delete context.fn
return res;
}
  • Apply
1
2
3
4
5
6
7
8
9
Function.prototype.myApply = function (context) {
context = context || this
context.fn = this;
const _arr = Array.from(arguments);
_arr.shift();
const res = context.fn(_arr.shift().toString())
delete context.fn;
return res;
}

The End

最后,其实是有问题的,问题原因请看如下 issue;

issue传送门