前端小技巧: TS实现bind函数,call函数,以及apply函数

Js面试常客之手写实现call、apply、bind方法(一看就会,附详细截图) 我们知道,call、apply、bind函数可以改变this的指向。 用例子验证,现在有一个对象,里面有属性跟一个showName方法 let initObj = { name:'gao', age:18 showName:function(){ console.log(this.name,'name') } } 直接执行如下代码 initObj.showName() 打印信息如下 此时,新建一个对象,里面只有属性,没有方法 let newObj = { . 阅读详情

bind 函数实现

  • 返回一个新函数,但是不执行

    Function.prototype.customBind = function (context:any, ...bindArgs: any[]) {
      // context 是bind传入的this
      // bindArgs 是bind传入的各个参数
      const self = this // 当前函数本身
      return function(...args:any[]) {
        const newArgs = bindArgs.concat(args)
        return self.apply(context, newArgs)
      }
    }
    
    function fn(this:any, a:any, b:any, c:any) {
      console.info(this, a, b, c)
    }
    
    const fn1 = fn.customBind({x: 100}, 10)
    fn1(20, 30)
    
  • 实际上,原生js中,bind 底层用的就是 apply

  • bind是返回一个新函数,不执行

  • call和apply是会立刻执行的

call 函数实现

Function.prototype.customCall = function (context: any, ...args: any[]) {
  if (!context) context = globalThis
  if (typeof context !== 'object') context = new Object(context) // 值类型转化为对象
  const fnKey = Symbol()
  context[fnKey] = this // this 就是当前的函数
  const res = context[fnKey](...args) // 绑定了this 这是立即执行
  delete context[fnKey]
  return res
}

function fn(this:any, a:any, b:any, c:any) {
  console.log(this, a, b, c)
}

fn.customCall({x:100}, 1, 2, 3) // 这里会立即执行

apply 函数实现

Function.prototype.customApply = function (context: any, args: any[] = []) {
  if (!context) context = globalThis
  if (typeof context !== 'object') context = new Object(context) // 值类型转化为对象
  const fnKey = Symbol()
  context[fnKey] = this // this 就是当前的函数
  const res = context[fnKey](...args) // 绑定了this 这是立即执行
  delete context[fnKey]
  return res
}

function fn(this:any, a:any, b:any, c:any) {
  console.log(this, a, b, c)
}

fn.customApply({x:100}, 1, 2, 3) // 这里会立即执行

总结

  • 绑定 this
  • 传入执行参数
  • 分析:
    • 如何在函数执行时,绑定this
    • 如:const obj = {x: 100, fn() {this.x}}
    • 执行obj.fn(), 此时fn内部的this就指向obj
    • 可以借次来实现函数绑定 this
  • 用 call 实现 apply, 用 apply 实现 call 不可取
  • 原生 call apply 的 this
    • 如果this是值类型,会被 new Object(…)
    • 如果this是null的话,会变成 globalThis
  • Symbol 的作用,是防止属性之间的冲突
Typescript 中bind的使用 在TypeScript中,bind() 方法用于创建一个新的函数,当这个新函数被调用时,它的this值会被绑定到传递给bind()方法的参数,这种特性在事件处理函数或者回调函数中非常有用,因为在这些场景下,我们通常需要将当前上下文(this)传递给这些函数。 阅读详情

相关推荐

从硅片到时钟:揭秘SiTime MEMS谐振子的精密制造之旅

本文深入解析了SiTime MEMS谐振子的精密制造工艺,从硅晶圆的提纯到DRIE深硅刻蚀,再到真空封装技术,揭示了其如何克服传统石英晶振的局限。通过对比测试数据,展示了MEMS谐振子在精度、可靠性和生产效率上的显著优势,特别是在5G基站和汽车电子等领域的应用潜力。

weixin_42522953的博客 404

关于ts中的指针问题call,bind, apply

与call一样, 只是将参数改成了数组。

monk96的博客 2248

UE5 Decal混合进阶:如何用DBuffer实现自定义Normal插值(附完整材质配置流程)

本文深入解析了UE5中利用DBuffer技术实现Decal自定义Normal插值的完整流程。通过详细的材质配置步骤和核心算法说明,帮助开发者突破传统混合模式限制,掌握高级法线控制技巧,特别适合需要精细环境细节的3A级项目开发。

table的专栏 225

javascript方法--bind()

bind方法,顾名思义,就是绑定的意思,到底是怎么绑定然后怎么用呢,下面就来说说我对这个方法的理解。 语法 fun.bind(this,arg1,arg2,...) bind()方法会创建一个新的函数,称为绑定函数,fun方法在this环境下调用 该方法可传入两个参数,第一个参数作为this,第二个及以后的参数则作为函数的参数调用 实例 1.创建绑定函数 1...

weixin_30402085的博客 380

手把手教你安装 Vivado2022.2(附安装包)

Vivado 2022.2版本与之前的版本相比,具有以下几个显著的优势:电源设计管理器(PDM):Vivado 2022.2引入了全新的电源设计管理器(PDM),这是一个下一代功耗评估平台,为Versal® 和 Kria™ SOM提供了准确一致的功耗估计能力。PDM是Versal产品家族的首选功耗评估工具,为Versal ACAP硬IP块提供增强向导,简化从XPE向PDM的迁移,帮助用户获得准确的功耗评估。

dpwkj的博客 2万+

Qt绘图实战:用QGraphicsItem实现可拖拽箭头连接(附完整代码)

本文详细介绍了如何使用Qt的QGraphicsItem框架实现一个功能完备的可拖拽箭头连接组件。通过核心代码示例,讲解了如何创建自定义图形项、实现智能吸附、碰撞检测以及实时拖拽编辑路径,为构建流程图、拓扑图等专业图形编辑器提供了完整的解决方案。

m2n3b4v5c6的博客 627

TS bind call apply区别以及实现

Ts中bind call apply区别以及实现

百合花的IT 936

Super4PCS文章阅读笔记

Super4PCS阅读笔记 Super4PCS阅读笔记 前言 前言 今天给大家分享一下点云配准四点法4PCS0的变种——Super4PCS。此算法的原文在:Super4PCS: Fast Global Pointcloud Registration via Smart Indexing。稍微我也会写一篇关于如何使用这篇文章的里所提供的代码进行点云粗配准。关于四点法...

Vodake的博客 4540

JS中bind、call和apply的作用以及在TS装饰器中的用法

`bind`、`call`和`apply`在函数式编程时候非常有用,本文旨在记录一下我遇到过的一些用法和知识点,也记录一下在装饰器中的用法。

鹏多多的博客 1910

用Python+PyTorch实现DQN无人机避障:从环境搭建到实战训练(附完整代码)

本文详细介绍了如何使用Python和PyTorch框架,基于深度强化学习中的DQN算法,实现一个无人机自主避障系统。内容涵盖从自定义环境搭建、DQN智能体核心算法实现,到完整的训练流程与超参数调优,并提供了可视化演示与进阶优化方向,为开发者提供了从理论到实践的完整指南。

kubernetes8ctl的博客 641

【QNX+Android虚拟化方案】136 - QNX 侧 Coredump 文件解析

【QNX+Android虚拟化方案】136 - QNX 侧 Coredump 文件解析

|~~~热爱生活、努力学习的小伙汁~~~| 1913

JS—call,apply,bind:1分钟掌握三者的区别

这里还遇到了另一个小插曲,我注册这个容器的方法是在父类中写的,我直接在父类的构造方法里面去初始化容器。我在项目启动的时候,通过容器存储我有哪些方法,说白了就是一个map,key是方法名,value是方法。H5给我方法名的时候,我通过map去获取,获取到了就说明有这个方法,没获取到就说明没有。我第一个版本这些方法全都写的静态,静态方法会有一个问题,那就是我如果启动了两个webview,只有一个对象去通信,理论上是有问题。而是,直接方法()执行的。这样,就会在执行方法的时候,this指向的不是我实际的对象。

海晨忆的博客 1184

XLSX Workbench 在 ABAP 世界的定位与实战:从概念到完整示例

XLSX Workbench 在可视化、易维护与批量后台生成三方面填补了 ABAP 报表到 Excel 的空白。它与官方类及社区明星 abap2xlsx 形成了“模板驱动、代码驱动、二者兼顾”的互补格局。掌握 Workbench 后,开发者能把精力集中在业务逻辑以及数据质量,而把排版细节交给图形化工具,大幅加速交付与迭代。通过本文提供的示例,你可以立即在项目中落地并尝到效率提升的红利。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 525

10、call、apply、bind的区别

call、apply、bind的区别 1、call和apply的区别 使用场景: 伪数组借用数组方法 这里我们使用 arguments(伪数组)、 例:function fu(){ console.log(argumets)//首先打印一下 伪数组 } fu(2,3,4,5,6) //实参 需求:在伪数组中添加 一个数字 casll方法:借用数组的方法来操作数组 // 只添加一个参数的 时候 Array.prototype.push.call(arguments,100) // 借用

派大星儿的博客 247

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Javascript call、apply、bind 的原理与应用

Javascript 中关于 call、apply、bind 函数的原理及应用,持续更新。

qq_20765533的博客 381

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

基于prototype, this, eval实现 call、apply、bind方法

// 模拟call实现 Function.prototype.call_test = function(context){ var ctx = context || window ctx.fn = this let args = [] for(let i = 1 , len = arguments.length ; i< len; i ++){ args.push('arguments['+i+']') } let fn = eval('ctx.fn('+args+')') de

zxw305的博客 247

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

call()、apply()、bind()详解

在 JavaScript 中,this 是指当前函数中正在执行的上下文环境;当你调用一个函数时,this总是作为一个(隐式)参数。(1)、宽松模式下的普通函数: this总是指向全局对象,(在浏览器中是window)var a=123; var A=function(){ return this; //Window }(2)、严格模式下 使用严格模式,只需要将 ‘use strict’

448

「前端料包」一文彻底搞懂JavaScript中的this、call、apply和bind

前言 关于JavaScript中this又是一个老生常谈的话题,也是面试绕不开的经典考题。「前端料包」 系列第三篇就一起聊聊关于this的话题。写的很小白,如有不对,欢迎各路大佬指正~ 在讲this之前,先得说说环境 这个概念。一门语言在运行的时候,需要一个环境,叫做宿主环境。对于JavaScript,宿主环境最常见的是web浏览器,另一个最为常见的就是 Node 了,同样作为宿主环境,node ...

Jake Zhang 654

call、apply、bind三者的用法和区别

fn.call

sq66666的博客 328

箭头函数和普通函数的区别以及bind(),apply(),call()的区别.

1.箭头函数和普通函数的区别 ()=>{} 箭头函数又称匿名函数,不能作为构造函数,不能使用new let f = () =>{ console.log('123') } let fc = new f(); //这一行报错 f is not a constructor 箭头函数不绑定argumets,取而代之用rest参数解决 //普通函数 function A(a){ console.log(arguments); //伪数组 arguments是一个参数的集合 [1,2,3,4,5

码字员的博客 914

深入浅出妙用 Javascript 中 apply、call、bind

apply、call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向。 JavaScript 的一大特点是,函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念。 先来一个栗子:

tmac937436的博客 326

javascript中call()、apply()、bind()的用法终于理解

其实是一个很简单的东西,认真看十分钟就从一脸懵B 到完全 理解! 先看明白下面:   例1 obj.objAge; //17 obj.myFun() //小张年龄undefined   例2  shows() //盲僧  比较一下这两者this 的差别,第一个打印里面的this 指向obj,第二个全局声明的shows()函数 this...

a5607754的博客 171

一篇全——函数的this指向(箭头函数,call,apply,bind方法)

this一般指向我们的调用者,箭头函数没有this,call,apply,bind改变函数this指向方法

m0_61698324的博客 559

关于改变this指向的三种方式:call、apply、bind

在写程序过程中,我们经常性的需要去改变函数的this指向问题,为此,js有专门提供的几个方法:call、apply、bind 他们都是因改变this指向而存在,但既然存在这么多种,一定有本质的区别,下面我们用代码来详细说明(实践是检验真理的唯一标准): 创建一个简单的函数: 上面函数 fn 执行,打印结果如图 接下来,我们使用call,apply,bind方法去改变this能否成功 从上面可以看出apply方法报错,bind没执行,只有call执行成功。这是因为写法不同,我们按照官方提供的方法正确操作:

weixin_47783830的博客 317

JavaScript函数调用和不同函数(apply,bind,call)的this指向问题。

函数定义方式 所有函数都Function的实例对象。 函数也属于对象 指向:表示这个函数是谁的属性。调用函数得人是谁。函数指向window就是,window调用这个函数。 三种方式 <script> //1.自定义函数 function f(){}; //2.函数表达式(匿名函数) var fun=func...

qq_42964711的博客 218

JS:call、bind、apply的区别 --->面试题

改变函数内部this指向 常用的有:bind()、call()、apply()三种。 1.call()方法: call()方法可以调用对象,可以改变函数this的指向,也可以实现继承。 // 语法格式 // thisArg:当前调用的这个函数this指向的是谁 // arg1 arg2:传递的其他参数,和普通函数里的参数一样 fun.call(thisArg,arg1,arg2,...); ...

weixin_46682277的博客 239
上一篇: 前端小技巧: TS实现柯里化函数
下一篇: 前端小技巧: TS实现深拷贝函数,考虑 Map, Set, 循环引用
Wang's Blog
博客等级 码龄12年 7438粉丝 2422原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值