js--手写call和apply方法干货注释满满

这篇具有很好参考价值的文章主要介绍了js--手写call和apply方法干货注释满满。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我们都知道js中call和apply都是改变this指向的,这篇文章我们一起来实现call和apply的底层吧!我们先来看一下js中的call和apply的用法

一.用法

1.call用法 传递参数逗号分隔

// 1.js call的用法
function fnc(a,b,c) {
  console.log(this.name,a,b,c);
}
var obj = {
  name: "逍遥的码农",
};
// 这里我们想用fnc函数打印出obj对象里的name属性
// 把obj为参数给call函数传递过去
fnc.call(obj,"参数1","参数2","参数3")

2.apply用法 传递参数为数组

// 1.js apply的用法
function fnc(a,b,c) {
  console.log(this.name,a,b,c);
}
var obj = {
  name: "逍遥的码农",
};
// 这里我们想用fnc函数打印出obj对象里的name属性
// 把obj为参数给apply函数传递过去
fnc.apply(obj,["参数1","参数2","参数3"])

二.手写实现call

1.手写myCall改变this指向

function fnc(a, b, c) {
  console.log(this.name, a, b, c);
}
var obj = {
  name: "逍遥的码农",
};

Function.prototype.myCall = function (obj) {
  // 首先看一下这里的this 这里的this为fnc函数
  console.log(this);
  // 我们给传过来的obj添加fnc函数 相当于obj里面添加了一个p函数为fnc函数
  obj.p = this;
  // 运行p函数 这里fnc的this已经被改变为obj fnc函数正常打印出name
  obj.p();
  // 运行完成删除p方法 不能改变对象数据
  delete obj.p
};
fnc.myCall(obj);

这里this指向已经改变,但是还不可以传递参数接下来传参

2.传递参数 逗号分隔传参

function fnc(a, b, c) {
  console.log(this.name, a, b, c);
}
var obj = {
  name: "逍遥的码农",
};

Function.prototype.myCall = function (obj) {
  //这里用arguments 他是一个伪数组并不是真正的数组 需要给他转换成数组 这里使用Array.prototype.slice.call
  console.log(arguments)
  // 这里从第一个下标截取 因为第一个参数为obj 我们不需要
  var ars =  Array.prototype.slice.call(arguments,1)
  console.log(ars)
  // 首先看一下这里的this 这里的this为fnc函数
  console.log(this);
  // 我们给传过来的obj添加fnc函数 相当于obj里面添加了一个p函数为fnc函数
  obj.p = this;
  // 运行p函数 这里fnc的this已经被改变为obj fnc函数正常打印出name 给p传递参数
  obj.p(...ars);
  // 运行完成删除p方法 不能改变对象数据
  delete obj.p
};
fnc.myCall(obj,"参数1","参数2","参数3");

这里就完成了call方法 接下来的apply肯定小伙伴已经懂了吧 来咱们继续

二.手写实现apply

1.手写myApply 数组传递参数

Function.prototype.myApply = function (obj, arr) {
  // 这里的this还是为为fnc函数
  console.log(this);
  obj.p = this;
  // 这里的arr为数组直接传递过去就可以了
  obj.p(...arr);
  delete obj.p;
},
fnc.myApply(obj, ["参数1", "参数2", "参数3"]);

apply很简单 只要把call弄懂了apply就很简单啦文章来源地址https://www.toymoban.com/news/detail-735140.html

到了这里,关于js--手写call和apply方法干货注释满满的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 17 JavaScript 中的call和apply

    17 JavaScript 中的call和apply 对于咱们逆向工程师而言. 并不需要深入的理解call和apply的本质作用. 只需要知道这玩意执行起来的逻辑顺序是什么即可 在运行时. 正常的js调用: 接下来, 我们可以使用call和apply也完成同样的函数调用 apply和他几乎一模一样. 区别是: apply传递参数要求是

    2024年02月11日
    浏览(8)
  • 前端 JS 经典:apply、call、bind

    1. 概念 都是用来改变函数中 this 指向的。区别在于 apply、call 传参方式不一样,调用后,直接执行函数。bind 调用后,返回一个函数体,不直接执行函数。 2. 为什么用 那为什么要改变 this 指向呢。正常情况下,谁调用函数 this 就指向谁。那调用这个函数的那个谁,要访问另一

    2024年02月07日
    浏览(9)
  • 基于matlab实现极致攻防优化算法TTA求解复杂山地环境下无人机三维路径规划研究 注释清楚,干货满满,直接运行

    基于matlab实现极致攻防优化算法TTA求解复杂山地环境下无人机三维路径规划研究 注释清楚,干货满满,直接运行

     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进, 代码获取、论文复现及科研仿真合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab完整代码及仿真定制内容点击👇 智能优化算法       神经网络预测       雷达通信    

    2024年02月04日
    浏览(31)
  • 【延伸学习】TS(JS)类的继承(prototype、call、apply,extends)

    【延伸学习】TS(JS)类的继承(prototype、call、apply,extends)

    PS:文末附上完整的代码(是在CocosCreator下运行的) 一. 基(父)类   基类包含三个成员变量(名字、年龄)还有一个后面用于测试的数组,两个原型方法(输出名字,输出年龄),还有一个类似静态函数的方法。 基类唯一测试的,就是用类名可以直接调用eat这个静态方法。

    2024年01月25日
    浏览(6)
  • Js:apply/call/bind、作用域/闭包、this指向(普通,箭头,JS/Vue的this)

    Js:apply/call/bind、作用域/闭包、this指向(普通,箭头,JS/Vue的this)

    共同点: apply()、call() 和 bind() 方法 三者作用都是 改变this指向。 接收的第一个参数都是this要指向的对象 区别: apply只有两个参数,第二个参数为数组; call和bind传参相同,多个参数依次传入的; call和apply都是对函数进行直接调用(立即执行),而bind方法不会立即调用函数

    2023年04月08日
    浏览(9)
  • 【JavaScript】手撕前端面试题:手写Object.create | 手写Function.call | 手写Function.bind

    【JavaScript】手撕前端面试题:手写Object.create | 手写Function.call | 手写Function.bind

    🖥️ NodeJS专栏:Node.js从入门到精通 🖥️ 博主的前端之路(源创征文一等奖作品):前端之行,任重道远(来自大三学长的万字自述) 🖥️ TypeScript知识总结:TypeScript从入门到精通(十万字超详细知识点总结) 🧑‍💼个人简介:大三学生,一个不甘平庸的平凡人🍬 👉

    2024年02月21日
    浏览(16)
  • JavaScript【History 对象、Cookie 对象 、封装cookie操作、apply、call和bind函数、面向对象简介、new 命令】(十八)

    JavaScript【History 对象、Cookie 对象 、封装cookie操作、apply、call和bind函数、面向对象简介、new 命令】(十八)

    目录 History 对象 History.back()  History.forward()  History.go() 

    2024年02月12日
    浏览(11)
  • 54-函数的3种定义,函数的4种调用:函数模式调用,方法模式调用,构造函数模式调用,apply call bind调用

    一.函数的3种定义  1.函数的声明定义:具有声明提升 2.函数的表达式定义 3.构造函数定义 var 变量 = new F unction(\\\"形参1\\\",\\\"形参2\\\",\\\"形参3\\\",\\\"方法体\\\"); 二.函数的4种调用 1普通模式调用 2. 内联模型 函数模式调用, this 指向 window  

    2024年01月25日
    浏览(7)
  • JavaScript中apply函数方法多种使用方法!

    在JavaScript中, apply 是函数对象的一个方法,用于调用一个函数,并指定函数内部的 this 上下文以及函数的参数列表。它与另一个方法 call 功能类似,但是参数传递的方式略有不同。 apply 方法的语法如下: thisArg : 在调用函数时指定的 this 上下文,即函数内部的 this 指向的对

    2024年03月10日
    浏览(7)
  • unsigned详讲(干货满满)

    unsigned详讲(干货满满)

    前言 : 过年偷懒了(●ˇ∀ˇ●),但是年后开学了一定要恢复学习状态,在复习加继续学习的途中,我发现对于unsigned的掌握并不是很熟练,于是翻阅了各个大佬的博客以及书籍,总结了对于unsigned的一些知识点。(如有不对的地方,欢迎各位大佬指正🤭) 什么是unsi

    2024年02月14日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包