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

JS手写代码篇---手写apply方法

11、手写apply方法

apply方法的作用:

apply 是一个函数的方法,它允许你调用一个函数,同时将函数的 this 值设置为指定的值,并将函数的参数作为数组(或类数组对象)传递给该函数。

与call的区别:

最大的区别就是参数部分:

apply:

function greet(greeting, name) {console.log(greeting + ', ' + name);
}var args = ['Hello', 'Alice'];
greet.apply(null, args); // 输出: Hello, Alice

call:

function greet(greeting, name) {console.log(greeting + ', ' + name);
}greet.call(null, 'Hello', 'Alice'); // 输出: Hello, Alice

所以在手写的时候我们格外要注意apply当中参数的解决:与call不同的就是,apply里面对于args的处理不再是…args,因为传递的是一个数组,通过扩展运算符处理数组就好。

             // 手写aoolyFunction.prototype.myApply = function (obj, args) {//args是数组// 先判断this是不是函数if (typeof this !== 'function') {throw new TypeError("this is not a function")}// 如果是null或者undefiedobj = obj === null || obj === undefined ? globalThis : Object(obj);//    属性唯一const key = Symbol('temp');obj[key] = this;let res = null;// 要对args进行判断:null或者undefied// 这里要注意一下:对args进行判断// args == null 在 JavaScript 中等价于 args === null || args === undefined。if (args == null) {res = obj[key]();} else {res = obj[key](...args);}// 删除属性、delete obj[key];return res;}

是否对args进行判断:

  • 在实现 myCall 方法时,通常不需要对 args 进行判断,因为 myCall 方法的设计就是接受多个参数,从第二个参数开始,每个参数都会作为函数的参数传递。因此,args 参数是一个可变参数列表,不需要进行额外的判断。
  • 然而,在实现 myApply 方法时,需要对 args 进行判断,因为 myApply 方法接受一个数组或类数组对象作为参数,需要检查 args 是否为 nullundefined,如果是,则不传递任何参数;否则,使用扩展运算符 ...args 来传递参数。

pe.myApply = function (obj, args) {//args是数组
// 先判断this是不是函数
if (typeof this !== ‘function’) {
throw new TypeError(“this is not a function”)
}
// 如果是null或者undefied
obj = obj === null || obj === undefined ? globalThis : Object(obj);
// 属性唯一
const key = Symbol(‘temp’);
obj[key] = this;
let res = null;
// 要对args进行判断:null或者undefied
// 这里要注意一下:对args进行判断
// args == null 在 JavaScript 中等价于 args === null || args === undefined。
if (args == null) {
res = objkey;
} else {
res = objkey;
}
// 删除属性、
delete obj[key];
return res;
}
``是否对args进行判断:

  • 在实现 myCall 方法时,通常不需要对 args 进行判断,因为 myCall 方法的设计就是接受多个参数,从第二个参数开始,每个参数都会作为函数的参数传递。因此,args 参数是一个可变参数列表,不需要进行额外的判断。
  • 然而,在实现 myApply 方法时,需要对 args 进行判断,因为 myApply 方法接受一个数组或类数组对象作为参数,需要检查 args 是否为 nullundefined,如果是,则不传递任何参数;否则,使用扩展运算符 ...args 来传递参数。
http://www.lqws.cn/news/133723.html

相关文章:

  • Rhino
  • 项目实战——C语言扫雷游戏
  • Python数据可视化科技图表绘制系列教程(二)
  • UART协议调试遇到的一个问题
  • C++算法训练营 Day8 字符串(1)
  • Linux 环境下 PPP 拨号的嵌入式开发实现
  • DPO算法微调实战
  • C++ 新特性详解:Lambda 表达式全解析(含实战案例)
  • Spring AI入门及案例、模型讲解、向量化和RAG等高级应用…
  • Elasticsearch中的监控(Monitoring)功能介绍
  • 3. 表的操作
  • cocos3.X的oops框架oops-plugin-excel-to-json改进兼容多表单导出功能
  • 《树数据结构解析:核心概念、类型特性、应用场景及选择策略》
  • 短剧+小说网盘搜索系统(支持全网网盘转存拉新)
  • 数组1 day7
  • Excel 透视表以及透视图应用(基础版)
  • day21 常见的降维算法
  • 怎么通过 jvmti 去 hook java 层函数
  • AI大模型学习三十二、飞桨AI studio 部署 免费Qwen3-235B与Qwen3-32B,并导入dify应用
  • 【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
  • nginx配置
  • 2025 年最新 conda 和 pip 国内镜像源
  • JavaWeb简介
  • Python 2.7 退役始末:代码架构缺陷与社区演进路线图
  • Git Github Gitee GitLab
  • Codeforces Round 1027 (Div. 3)
  • [C]C语言日志系统宏技巧解析
  • PageHelper-分页插件
  • Python爬虫:trafilatura 的详细使用(快速提取正文和评论以及结构,转换为 TXT、CSV 和 XML)
  • 平面上的最接近点对