/*
call:
1:调用函数
2:改变函数的this指向为call的第一个参数
3:返回函数的返回值
*/
Function.prototype.myCall = function (context, ...argv) {
/*
context有3种形态
- null undefined ----> window
- 基本包装类型----> 包装对象
- 对象类型---->保持
*/
if (context === null || context === undefined) {
context = window;
}
if (typeof context !== 'object' && typeof context !== "function") {
context = Object(context);
}
//this是被mycall调用改变this的那个函数
//想要让this代表的函数中的this指向context,需要给context扩展一个方法值为this这个函数
const sy1 = Symbol();
context[sy1] = this;
//调用函数(真正调用的是this指向的那个函数,但是这个函数的this已经指向了context),并且拿到this代表的函数的返回值
const re = context[sy1](...argv)
//不影响原来的对象,所以把我们设置的属性删除掉
delete context[sy1];
//call返回 被调用函数的返回值
return re;
}