【JavaScript手撕代码】call、apply、bind

修改this指向

方法参数返回值作用
callthisArg, arg1, arg2, ...,注意,call接收的参数是一个参数列表函数返回值调用一个函数,将其 this 值设置为提供的值,并为其提供指定的参数。
applythisArg, [arg1, arg2, ...],请注意这里,apply接收的参数是一个参数数组函数返回值调用一个函数,将其 this 值设置为提供的值,并以数组形式为其提供参数。
bindthisArg, arg1, arg2, ...新函数创建一个新函数,当调用这个新函数时,它的 this 值被绑定到提供的值,并且它的参数序列前置指定的参数。

可以使用apply()call()方法以新创建的对象为上下文执行构造函数

开始之前,因为这三个都是会改变this的指向,而this指向是js中很重要的一个部分,所以我们停一停,复习一下this指向,以便更好地认识和实现这仨兄贵

this指向

1、构造函数通过new关键字构造对象时, this指向被构造出的对象

 function Game(name, type){
     this.name = name;
     this.type = type;
     Game.prototype.showThis = function(){
         console.log(this)
     }
 }
 var dmc = new Game('DMC', 'ACT')
 dmc.showThis()

image.png

可以看到指向的是被构造出来的dmc

2、全局作用域中,this指向window

image.png

3、谁调用方法,this指向谁

4、普通函数非通过其他人执行,this指向window

 function fn(){
     console.log(this)
 }
 fn()   //windowfunction fn1(){
     console.log(this)  // window
     function fn2(){
         console.log(this)
     }
     fn2()  // window
 }
 fn1()// 被赋值后再调用
 var obj = {
     fn: function(){
         console.log(this)
     }
 }
 var fn3 = obj.fn
 fn3()   // window

5、数组里面的函数,按照数组索引取出运行时,this指向该数组,其实就是数组调用函数,所以指向数组

 function fn(){
     console.log(this)
 }
 var arr = [fn1]
 arr[0]()  // [fn] --> 就是arr

6、=>函数中的this指向他的父级非=>函数this

callapply都不能改变=>函数的this

以上可以浓缩为:非=>函数的this指向它执行时的上下文对象,=>函数的this指向它的父级非=>函数的this

7、callapplybind可以改变函数运行时候函数中this的指向

节流防抖中可以使用这种方式实现

call

call的主要用途:

  • 直接调用函数
  • 可改变函数内部的this
  • 可以实现继承

使用上面的例子:

  • fn() 相当于 fn.call(null)
  • fn(fn2)相当于fn.call(null, fn2)
  • obj.fn()相当于obj.fn.call(obj)

手写:

 // context - 传入的执行上下文对象, 不传或者传null就默认为window
 // args - 传入的参数列表
 Function.prototype.myCall = function(context, ...args){
     // this只有指向函数才能执行
     if(typeof this != 'function'){
         return new TypeError(`type error! ${this} is not a function`)
     }
     // 获取传入的执行上下文context, 若未传入则指向window, 就是例如fn.call()、fn.call(null)这种
     context = context || globalThis // 使用globalThis是考虑到web和node下的全局this不一样
     // 缓存this到传入的执行上下文对象去执行, 这一步相当于改变了this指向, 即指向了context
     context.fn = this
     // this指向改变后, 传入参数, 原fn在执行上下文对象运行并缓存此时fn在context下运行得到的返回值
     const res = context.fn(...args)
     // 用完就删除执行上下文中新增的this, 取消绑定
     delete context.fn
     // 返回原fn在context下运行得到的返回值
     return res
 }

apply

apply的用途:

  • 调用函数,改变内部的this指向
  • 参数必须为数组
  • 主要应用于数组类
 // apply和call很像,就后面传参有点改动
 Function.prototype.myApply = function(context, args){
     if(typeof this != 'function'){
         return new TypeError(`type error! ${this} is not a function`)
     }
     context = context || globalThis
     context.fn = this
     // 因为传入的是数组, 所以如果没有参数就不要展开传进fn执行
     const res = args ? context.fn(...args) : context.fn()
     delete context.fn
     return res
 }

bind

  • 改变原函数内部指向
  • 返回改变指向后的拷贝

这里因为返回的是拷贝,所以我们要return的是一个function

 Function.prototype.myBind = function(context, ...args1){
     if(typeof context != 'undefined'){
         return new TypeError(`type error! ${this} is not a function`)
     }
     context = context || globalThis
     context.fn = this
     return function(...args2){
         const res = context.fn(...args1, ...args2)
         delete context.fn
         return res
     }
 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/212866.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Chat-GPT原理

GPT原理 核心是基于Transformer 架构 英文原文: ​ Transformers are based on the “attention mechanism,” which allows the model to pay more attention to some inputs than others, regardless of where they show up in the input sequence. For exampl…

数据结构中的二分查找(折半查找)

二分法:顾名思义,把问题一分为2的处理,是一种常见的搜索算法,用于在有序数组或这有序列表中查找指定元素的位置,它的思想是将待搜索的区间不断二分,然后比较目标值与中间元素的大小关系,然后确定…

基于51单片机的十字路口交通灯_5s黄灯倒计时闪烁

基于51单片机十字路口交通灯_5s黄灯闪烁 (程序仿真仿真视频) 仿真:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:J006 功能要求 交通灯运行状态: (1&…

[c++]——string类____详细初步了解string类的运用

在成为大人的路上喘口气. 目录 🎓标准库类型string 🎓定义和初始化string对象 💻string类对象的常见构造 💻string类对象的不常见构造 💻读写string对象 🎓 string类对象的修改操作 &#x1f4…

题目:DNA序列修正(蓝桥OJ 3904)

题目描述: 解题思路: 从左到右扫描第一条 DNA 序列和第二条 DNA 序列的每一个位置,检查它们是否互补。 如果某个位置不互补,我们需要寻找第二条 DNA 序列中后续位置的碱基,看是否可以通过交换使这两个位置都互补。如果…

博途PLC数组指针应用(SCL)

CODESYS数组类型变量使用介绍 https://rxxw-control.blog.csdn.net/article/details/131375218https://rxxw-control.blog.csdn.net/article/details/131375218 博途PLC数组类型变量使用介绍还可以查看下面文章博客: https://rxxw-control.blog.csdn.net/article/details/1…

模板可变参数/包装器

一、什么是模板可变参数 1、对比函数可变参数 可变参数即参数的数量是不确定的,底层根据用户传入的数量,开一个数组存储对应的参数。 2、基本形式 args -- argument 参数 [0,n]个参数 // Args是一个模板参数包,args是一个函数形参参数包…

Kubernetes基础(十)-自动伸缩

1 介绍 Kubernetes提供了多种自动伸缩机制,主要常见的有: HPA(Horizontal Pod Autoscaling)VPA(Vertical Pod Autoscaler)CA(Cluster Autoscaler)CPA(Custom Pod Autos…

HTML_web扩展标签

1.表格标签 2.增强表头表现 4.表格属性(实际不常用) 结构标签: 合并单元格: 更多请查看主页

TEMU三季度销售额或达50亿美金,多多跨境已成第二增长引擎

2023年11月28日,拼多多发布了2023年第三季度业绩报告。 报告显示,三季度的收入为688.4亿元,同比增长93.9%,按照美国通用会计准则,实现净利润155.4亿元,净利润率达到22.6%。 拼多多将近翻倍的业绩成长&…

C语言结构体详解(二)(能看懂文字就能明白系列)文章很长,慢慢品尝

系列文章目录 第一章 结构体的介绍和基本使用 🌟 个人主页:古德猫宁- 🌈 信念如阳光,照亮前行的每一步 文章目录 系列文章目录🌈 *信念如阳光,照亮前行的每一步* 前言前面一篇文章主要介绍了结构体的基础…

c语言-联合体和枚举

文章目录 一、联合体1. 联合体类型的声明和创建2. 联合体的特点3. 联合体大小的计算4.总结 二、枚举1. 枚举类型的声明2. 枚举类型的优点3. 枚举类型的使用 一、联合体 (1) 像结构体⼀样,联合体也是由一个或者多个成员构成,这些成…

JAVA代码优化:CommandLineRunner(项目启动之前,预先加载数据)

CommandLineRunner接口是Spring Boot框架中的一个接口,用于在应用程序启动后执行一些特定的代码逻辑。它是一个函数式接口,只包含一个run方法,该方法在应用程序启动后被自动调用。可以帮助我们在应用程序启动后自动执行一些代码逻辑&#xff…

ElementPlus中 使用ElLoading.service, spinner: ‘el-icon-loading‘不生效

let downloadLoadingInstance ElLoading.service({ text: "正在下载数据,请稍候",spinner: el-icon-loading, background: "rgba(0, 0, 0, 0.7)", })使用以上代码时,加载的圆圈出不来,使用f12查看,即使能出…

ssl下载根证书和中间证书

为了保证客户端和服务端通过HTTPS成功通信,您在安装SSL证书时,也需要安装根证书和中间证书。本文介绍如何获取根证书和中间证书。 使用说明 如果您的业务用户通过浏览器访问您的Web业务,则您无需关注根证书和中间证书,因为根证书…

团队怎么高效制作问卷?

制作调查问卷时并不是一个人就能单独完成,通常情况下,完成一份调查问卷往往需要一个团队的成员参与,相互协作,共同完成。不过,多人协作经常会遇到协作壁垒,导致效率低下,那团队怎么才能高效协作…

【Linux】第二十四站:模拟实现C语言文件标准库

文章目录 一、实现细节1.需要实现的函数2.fopen的实现3.fclose4.fwrite5.测试6.缓冲区的实现7.FILE中缓冲区的意义 二、完整代码 一、实现细节 1.需要实现的函数 #include "mystdio.h"int main() {_FILE* fp _fopen("test.txt","w");if(fp N…

2023年5月电子学会青少年软件编程 Python编程等级考试一级真题解析(判断题)

2023年5月Python编程等级考试一级真题解析 判断题(共10题,每题2分,共20分) 26、在编写较长的Python程序时,所有代码都不需要缩进,Python会自动识别代码之间的关系 答案:错 考点分析:考查python代码书写格式规范,python编写较长的程序时,需要明确严格的缩进,不然有…

医美店会员管理系统预约小程序作用是什么

医美在美业中占据着一定地位,爱美使然和经济独立、悦己消费下,不少女性会前往医美机构做脸部整容、嫩肤补水等服务,如美容院一样都是具备本地外地属性的,因此在如今互联网盛行下,商家需要借势线上破解难题及增强生意效…

时序预测 | Python实现LSTM长短期记忆神经网络时间序列预测(多图,多指标)

时序预测 | Python实现LSTM长短期记忆神经网络时间序列预测(多图,多指标) 目录 时序预测 | Python实现LSTM长短期记忆神经网络时间序列预测(多图,多指标)预测效果基本介绍环境准备程序设计参考资料预测效果 基本介绍 LSTM是一种递归神经网络(RNN)的变体