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 = context[sy1](...argv)

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

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

}
posted @   听风小弟  阅读(272)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示