js中call、apply和bind方法的简单实现

JavaScript中call、apply、bind详解及手写实现 首先,我们都知道JavaScript中的this指向分为软绑定及硬绑定。并且this的指向与执行上下文有关系。在全局执行上下文中,this指向 全局对象(),在对象调用其内部方法时,this指向调用的地方,这就称为。那么如何使用呢?这就需要使用JavaScript中内置的方法来实现了。 阅读详情

1.call方法的实现

Function.prototype.hycall = function (thisArg, ...nums) {
    // 1.获取所要执行的函数
    let fn = this
    // 2.绑定this
    // 边界判断,判断绑定对象是否为空
    // Object()方法可以根据参数的值的类型返回相应的基本包装类型的实例
    thisArg=(thisArg!==undefined&& thisArg!==null)?Object(thisArg):window
    thisArg.fn = fn
    // 3.执行函数
    let result=thisArg.fn(...nums)
    // 4.返回函数的结果
    return result
}
function sum(nums1, nums2) {
    console.log(this)
    return nums1+nums2
}
let obj = { name: 'why' }
// console.log(sum.call(this,1,2))
console.log(sum.hycall(obj,1,2))

2.apply方法的实现

// 实现apply方法

// 1.将方法绑定在Function 的原型对象上
Function.prototype.hyapply=function (thisArg, nums){
    // 1.获取函数
    let fn = this
    
    // 2.处理绑定对象
    thisArg = (thisArg!==undefined&& thisArg!==null) ? Object(thisArg) : window
    // 3.执行函数 处理参数,参数为空时赋值为[]
    nums = nums || []
    thisArg.fn = fn
    console.log(thisArg)
    let result = thisArg.fn(...nums)
    delete thisArg.fn

    // 返回函数结果
    return result
}
let obj = { name: 'why' }
function sum(num1, num2) {
    return num1+num2
}

console.log(sum.hyapply(obj,[1,2]))

3.bind方法的实现

// 实现bind方法
Function.prototype.hybind = function (thisArg, ...argus) {
    // 1.获取函数
    let fn = this
    // 2.获取绑定对象
    thisArg = (thisArg !== undefined && thisArg !== null) ? Object(thisArg) : window
    
    function proxyFn(...proxyArgus) {
        thisArg.fn = fn
        let arg = [...argus, ...proxyArgus]
        let result=thisArg.fn(...arg) 
        delete thisArg.fn
        return result
    }
    // 返回新创建的函数
    return proxyFn
}
function sum(...argus) {
   let val= argus.reduce((pre, value) => {
        return pre + value
   })    
    return val
}
let obj = { name:'why'}
let fn=sum.hybind(obj, 1)
console.log(fn(2,3,4))

总结

这是对js中call、apply和bind方法的简单实现,并没有考虑很多边界条件,如如果绑定对象中已经有fn函数名的处理(可以用Symbol类型:symbol表示唯一的值)等等。欢迎大家一起学习讨论

原生JS实现 call apply bind call apply bind 的 作用 都是用来改变this的指向,在平时工作过程中,除了实现对象的继承,在写一些基础类,或者公用库方法的时候会用到它们,其他时候 call 和 apply 的应用场景并不多。 在React中bind常用来绑定事件,改变this的指向 call apply bind 的 区别 call apply方法都是在调用之后立即执行的,而bind是返回原函数,需要再调用一次才能执行 传参方式的区别 var newFn1 = fn1.bind(newObj,arg1,arg2....); bind 第一个参数为需改变的新指向,之后的参数以,隔开 如需调用该函数,需要再次 立即下载

相关推荐

基于NE555的触摸延时开关电路设计与实现

本文详细介绍了基于NE555芯片的触摸延时开关电路设计与实现方法。通过分析NE555的单稳态工作模式,结合定时电阻、电解电容等关键元件选型,提供了一套完整的电路搭建方案。文章还包含抗干扰设计、调试技巧及常见故障处理,帮助电子爱好者快速掌握触摸延时灯的制作要点。

weixin_29268267的博客 788

JS高级——实现apply、call、bind函数

实现apply、call、bind函数原理

@SCY 4752

基于SolidWorks宏的草图点坐标自动化提取与Excel集成

本文详细介绍了如何利用SolidWorks宏编程实现草图点坐标的自动化提取并与Excel集成,显著提升机械设计效率。通过VBA代码解析与优化,解决了人工记录坐标耗时易错的问题,并扩展了多草图批量处理、数据可视化等高级功能,适用于数控加工、质量检测等场景。

weixin_29251131的博客 460

js实现call、apply、bind方法

js实现call、apply、bind方法 一、call 函数的实现步骤: 判断调用对象是否为函数,即使我们是定义在函数的原型上的,但是可能出现使用 call 等方式调用的情况。 判断传入上下文对象是否存在,如果不存在,则设置为 window 。 处理传入的参数,截取第一个参数后的所有参数。 将函数作为上下文对象的一个属性。 使用上下文对象来调用这个方法,并保存返回结果。 删除刚才新增的属性。 返回结果。 // call函数实现 Function.prototype.myCall = function(

guoqkmiss的博客 755

详解一典型的反激式开关电源方案

如图,在某系统方案上看到下图所示的单端反激式开关电源方案。

alala120的博客 1万+

关于keil编译报.sct (7): error: L6236E: No section matches selector - no section to be FIRST/LAST.处理方法

使用keilUvision5向下兼容,选择S3C2440主款芯片编译运行汇编语言。 出现了一个错误: . \objectslex3-2.sct (7): error: L6236E: No section matches selector - no section to be FIRST/LAST. 我在网上搜了很多,没有找到适合修正我这里的错误的。故咨询陈老师,终于将这个错误解决。 错误如下: 修改过程: 打开小仙女棒 将linker的Use Memory Layout fromTarget Dial

weixin_45865666的博客 9523

详解JS中关于call、apply和bind的实现(源码实现)

在JavaScript中,call、apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向。 call、apply、bind方法的共同点: 1.都是用来改变函数的this对象的指向的; 2.第一个参数都是this要指向的对象; 3.可以利用后续参数传参; 区别: bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用 。 call()方法和apply()方法的作用相同,区别仅在于接受参数的方式不同。 一、call的源码

A20201130的博客 1626

头歌操作系统 课堂练习4.2:页式内存管理 答案 无解析

头歌操作系统 课堂练习4.2:页式内存管理 答案 无解析

kercii的博客 1万+

JavaScript | call、bind、apply原理

1、首先,通过(大写的Function,是在比较高级的地方声明函数)将自定义的myCall方法添加到所有函数的原型对象上,使得所有函数实例都可以调用该方法。(通过的方式)2、在myCall方法内部,首先通过判断调用myCall的对象是否为函数。如果不是函数,则抛出一个类型错误。(需要验证是否为函数)3、然后,判断是否传入了上下文对象context(第一个参数)。如果没有传入,则将context赋值为全局对象;ES11 引入了globalThis(window),它是一个统一的全局对象,无论在浏览器还是。

千禧年无敌优香大王的博客 521

PX4无人机offboard开发之旅

(慢慢更)无人机OFFBOARD开发

InTereSTingHE的博客 1078

Python量化交易实战:如何用pytdx库快速解析通达信.day文件(附完整代码)

本文详细介绍了如何使用Python的pytdx库高效解析通达信.day本地数据文件,构建免费、稳定的量化交易数据源。文章提供了从环境配置、基础数据读取、复权处理到板块信息获取的完整实战代码,并演示了如何将处理后的数据无缝接入Backtrader等回测框架,为量化策略开发提供可靠的数据基础。

ppp33的博客 1142

使用JS简单实现一下apply、call和bind方法

使用JS简单实现一下apply、call和bind方法

qq_52732369的博客 679

js手动实现函数的call,apply,bind方法,简单易懂

js手动实现call,apply,bind方法

qq_44241613的博客 467

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

原生js实现简单版apply、call以及bind方法

我们先来实现apply,上代码: <script type="text/javascript"> function Person(name, age) { this.name = name, this.age = age } Person.prototype.sayThis = function(x, y) { console.log('------' + x + y); console.log(this); console.log('------' + x + y

xiaozhang_jiuke的博客 297

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

简单模拟实现javascript中的call、apply、bind方法

目录引子隐式丢失硬绑定实现及原理分析总体实现(纯净版/没有注释)写在最后 引子优惠券网站 www.cps3.cn 读完《你不知道的JavaScript--上卷》中关于this的介绍和深入的章节后,对于this的指向我用这篇文章简单总结了一下。接着我就想着能不能利用this的相关知识,模拟实现一下javascript中比较常用到的call、apply、bind方法呢? 于是就有了本文,废话不多说全文开始! 隐式丢失 由于模拟实现中有运用到隐式丢失, 所以在这还是先介绍一下。 隐式丢失是一种常见的this绑定.

nidongla的博客 143

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

js中call,apply,bind方法的简单总结

1、apply 、call、bind 三者都是用来改变函数的 this 对象的指向的;2、apply、call、bind 三者第一个参数都是 this 要指向的对象;3、apply、call、bind 三者都可以利用后续参数传参;4、bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用。

qq_279364752的博客 971

bind、call、apply 三者之间区别?如何实现一个bind?

bind、call、apply 三者之间区别?如何实现一个bind?

zhaojiaxing123的博客 243

使用 js 简单的实现 bind、call 、aplly

Function.prototype._call = function(obj,...arg){ var me = this; var k = Symbol("test"); //生成唯一的 key obj[k] = me; var result = obj[k](...arg); delete obj[k]; return result;...

weixin_30690833的博客 100

call,apply,bind函数对比及实现

3.指针从function变化为thisArg(这里相当于给thisArg添加一个fn属性,值为function)1.调用function:function必须存在且是一个函数,之后调用并返回。2.传入参数thisArg,如果没有传入参数,则默认为window。整体上和call一样,只有参数不同,apply第二个参数为数组。4.取参数call传的参数(从第二个开始截取)

my的博客 105

前端常用方法——call、apply、bind的简易实现

前端常用方法——call、apply、bind的简易实现 场景 ​ call, apply,bind可以改变this的指向,利用es6的语法我们可以很简便的实现call,apply,bind 用call时,第一个参数为想调用的对象,第二个以及以后为函数调用时的参数,实现如下 Function.prototype.myCall = function(self,...args){ self = self || globalThis self.fn = this let result = self

weixin_42192909的博客 470

☀️七分钟教会你手写call、apply和bind

前言 面试官:如何改变 this 的指向?以及三者的共同点和不同点 我们:我们可以通过调用函数的 call、apply、bind 来改变 this 的指向。 面试官:来实现其中一个。 我们:…???? 温习一下 call、apply、bind的异同 共同点: 功能角度:三者都能改变this 指向,且第一个传递的参数都是 this 指向的对象。 传参角度:三者都采用的后续传参的形式。 不同点: 传参方面: call 的传参是单个传递(序列),而 apply 后续传递的参 数是数组形式。而 bi

小小前端攻城狮的博客 525

手写JavaScript的call、apply、bind函数

一.call、apply、bind函数介绍 在多数编程语言中都有this关键字,这个关键字 一般指向的是某个对象,比如说在JavaScript中this一般是在函数调用时,指向最后调用这个函数的对象。如果是在非严格模式下,直接执行函数,则指向我们的全局对象,比如说window。要记住,这个this一定是的在函数调用执行的时候生成的。对于每一个对象都有它的属性以及方法,比如说一个数组arr,arr实例对象可以通过原型链使用到它原型上的方法,而其他不是数组类型的则不能直接使用arr的一些方法,比如说类数组。然

qq_45924621的博客 172

apply 、 call 、bind 区别?实现一个bind

bind实现

weixin_70238655的博客 165

自己实现call|bind|apply三兄dei

要简单实现call、bind、apply首先要弄清楚这哥仨是啥,调用入参返回值都是什么,然后照葫芦画瓢,一点点填起来就好了; 能看思考咋实现的想必已经不需要在多赘言三个方法了,直接开始搞起; 首先这哥仨都是改变this指向,简化问题就是实现myX把fn.myX(arg)中的参数传递给fn,并把fn的this修改成arg; var name = 'dahuang'; function a( ){ console.log(this.name); } obj = {nam

I1326的博客 310

js手动实现call,apply,bind

原文https://www.jianshu.com/p/3b69fb0d4c2f    我也不知道为什么只能显示一部分  好气哦  看原文吧  先分析下3个方法的作用 改变this的指向。 传入参数。 call apply返回函数结果, bind 返回新函数 call 改变this的指向  首先我们知道,对象上的方法,在调用时,this是指向对象的。 let o = { ...

木木 2594
上一篇: 渐进增强与优雅降级
下一篇: javaScript基础-函数式编程中函数柯里化和组合函数的实现
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值