call

/*
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 = contextsy1

//不影响原来的对象,所以把我们设置的属性删除掉
delete context[sy1];

//call返回 被调用函数的返回值
return re;

}

posted @ 2022-05-06 09:09  听风小弟  阅读(283)  评论(0)    收藏  举报