当前位置: 首页 > news >正文

【前端手撕】call

call是改变this指向的方法,传入的参数是要指向的对象和函数需要的参数序列。

改变this指向还可以用apply和bind,区别如下:

方法传参方式执行时机返回值
call参数序列(逐个传入)立即执行函数执行的结果
apply参数数组(或类数组)立即执行函数执行的结果
bind参数序列(逐个传入)返回新函数,稍后执行绑定了this的新函数

代码

简易版

Function.prototype.callSimple = function (context, ...args) { context = context || window // 确认上下文,如果没有上下文就默认window context.fn = this // 把当前函数赋值给上下文的fn属性(临时属性) const res = context.fn(...args) // 调用函数,传参 delete context.fn // 删除临时属性 return res }

健壮版

Function.prototype.call = function (context, ...args) { // 如果上下文是null或undefined,就默认window;否则用Object()转换为对象 // Object()包对象返回原对象,包原始类型返回对象包装类型。这是因为简单数据类型不能挂载属性,对象才可以 context = context !== null && context !== undefined ? Object(context) : window let tag = Symbol('call') // Symbol()创建一个唯一的符号值,避免与其他属性冲突/覆盖 context[tag] = this // 把当前函数赋值给上下文的tag属性(临时属性) const res = context[tag](...args) // 调用函数,传参。这里使用方括号是因为tag是一个符号值,不能用点号 return res }

Tips

1. bind传参数可以先传一部分参数,返回新函数,下次再传剩下的。这种特性叫函数柯里化(Currying)

2. 如果bind返回的新函数被new构造调用了,this会失效。因为new的优先级高于bind(但也只有new比bind高)

function Person(name) { this.name = name; } const BoundPerson = Person.bind({ name: '默认' }); // 试图绑定 this const p = new BoundPerson('李四'); console.log(p.name); // 输出:李四

因为new强行创建了一个新对象作为this,bind绑定的this被覆盖了。

http://www.jsqmd.com/news/1033097/

相关文章:

  • 电动车托运哪个最靠谱?分享真实经验 - 快递物流资讯
  • 蓝牙+WiFi 融合产品调研:智能体脂秤
  • 构建 Agent Harness:打造可靠 AI Agent 的核心控制层
  • 检查unionid是否所属当前钉钉企业/组织架构
  • RL驱动的神经架构搜索实战:从搜索空间设计到芯片部署
  • 分布式系统考察重点
  • 摩托车托运哪家便宜又靠谱?选这几点避坑 - 快递物流资讯
  • 2026深圳福田区搬家公司怎么选?本地人公认的优质搬家品牌服务商优选推荐 - 从来都是英雄出少年
  • BaiduPCS-Go命令行工具:彻底解决百度网盘管理难题的高效方案
  • 2026虚拟资源电商 暑假TOP 爆款品类(附虚拟资源进货渠道分享)
  • 《数组:让程序一下子记住一堆数据》
  • 拒绝断货焦虑!拥有大库存量的Nitronic60不锈钢厂商推荐 - 品牌2026
  • 2026年中武汉宝宝照推荐指南:一岁一咔家庭照相馆深度解析 - 品牌鉴赏官2026
  • Python实现协同过滤算法:从零搭建个性化小说推荐系统
  • Gemini Pro 2026实操指南:普通人如何用提示工程+本地化实现AI深度协作
  • Navicat密码解密终极指南:如何快速找回遗忘的数据库密码
  • 2026红石崖街道正规的空调回收公司有哪些 - 品牌排行榜
  • 2026餐饮店隔油池堵了怎么办?绍兴管道疏通商铺类专项服务评测,主打就是真实! - 极速版本
  • Orange3:如何通过可视化编程实现零代码机器学习分析
  • NXP MC33771 BMS评估板硬件配置与调试实战指南
  • ZigBee ZCL属性管理:核心函数原理、实战与调试指南
  • 从零上手经典8位MCU评估板:硬件调试与CodeWarrior开发全流程
  • 1N6506二极管阵列深度解析:从ESD保护到高速开关的实战应用
  • OpenSlide 终极指南:快速掌握虚拟切片图像处理技术
  • 深度学习入门完全指南:用Deeplearning4j-examples快速掌握Java深度学习
  • 电脑常见问题汇总
  • 2026年台州税务咨询选对=省心 企赢税务AI智能财税推荐 - 本地品牌推荐
  • AI Agent 入门:从会回答到能完成任务
  • 深度应用:YOLO检测模型解决实际视觉识别难题的关键策略
  • AI-Scientist:10分钟自动化科研工作流,让LLM为你完成科学发现全流程