JavaScript网络地址作为参数_JavaScript之bind的模拟实现

72a40760693d3f0807b166485f433725.gif

阅读本文约需要5分钟

大家好,我是你们的导师,我每天都会给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈)。昨天给大家分享了JavaScript的call和apply的模拟实现,今天给大家分享一下bind的模拟实现。

什么是bind?

一句话介绍 bind:bind() 方法会创建一个新函数。当这个新函数被调用时,bind() 的第一个参数将作为它运行时的 this,之后的一序列参数将会在传递的实参前传入作为它的参数。(来自于 MDN )。

由此我们可以首先得出 bind 函数的两个特点:返回一个函数、可以传入参数。

返回函数的模拟实现

从第一个特点开始,我们举个例子:

69fcad5757903f93a9b9f1ac5950556e.png

关于指定 this 的指向,我们可以使用 call 或者 apply 实现,关于 call 和 apply 的模拟实现,可以看看我昨天分享的文章:JavaScript之call和apply的模拟实现。我们来写第一版的代码:

ea107d249c058df0c2fb1d68f69e9da5.png

此外,之所以 return self.apply(context),是考虑到绑定函数可能是有返回值的,依然是这个例子:

f5e135609cca2f0fe92f7667884d2a98.png

传参的模拟实现

接下来看第二点,可以传入参数。这个就有点让人费解了,我在 bind 的时候,是否可以传参呢?我在执行 bind 返回的函数的时候,可不可以传参呢?让我们看个例子:

6735267c9dd05d6e3238500496d4e6b5.png

函数需要传 name 和 age 两个参数,竟然还可以在 bind 的时候,只传一个 name,在执行返回的函数的时候,再传另一个参数 age!这可咋办?不急,我们用 arguments 进行处理:

33b9a9169a7bb6697aad87a25d93d28e.png

构造函数效果的模拟实现

完成了这两点,最难的部分到了!因为 bind 还有一个特点,就是:一个绑定函数也能使用new操作符创建对象:这种行为就像把原函数当成构造器。提供的 this 值被忽略,同时调用时的参数被提供给模拟函数。

也就是说当 bind 返回的函数作为构造函数的时候,bind 时指定的 this 值会失效,但传入的参数依然生效。举个例子:

3c3441d2b8f74d1f0c5e7a33eda21f12.png

注意:尽管在全局和 foo 中都声明了 value 值,最后依然返回了 undefind,说明绑定的 this 失效了,如果大家了解 new 的模拟实现,就会知道这个时候的 this 已经指向了 obj。

所以我们可以通过修改返回的函数的原型来实现,让我们写一下:

b2285b6ef516c356da7d4d663b80d8e4.png

构造函数效果的优化实现

但是在这个写法中,我们直接将 fBound.prototype = this.prototype,我们直接修改 fBound.prototype 的时候,也会直接修改绑定函数的 prototype。这个时候,我们可以通过一个空函数来进行中转:

31d3e15daf9c727db6c8d4649f883242.png

到此为止,大的问题都已经解决。

三个小问题

1.apply 这段代码跟 MDN 上的稍有不同

在 MDN 中文版讲 bind 的模拟实现时,apply 这里的代码是:

self.apply(this instanceof self ? this : context || this, args.concat(bindArgs))

多了一个关于 context 是否存在的判断,然而这个是错误的!举个例子:

98944d3787d7000ec184beb35f759f23.png

以上代码正常情况下会打印 2,如果换成了 context || this,这段代码就会打印 1!所以这里不应该进行 context 的判断,大家查看 MDN 同样内容的英文版,就不存在这个判断!

2.调用 bind 的不是函数咋办?

不行,我们要报错!

43c62f6b737103b44319b84c09a5d8f6.png

3.我要在线上用

那别忘了做个兼容:

f80a38e5cf7498d6771faed2646cfc83.png

最终代码

所以最最后的代码就是:

c98ff4118817d6822a3fafcdf17f4062.png

今天就分享到这,如果觉得对你有一丢丢帮助,请点右下角【在看】,让更多人看到该文章。大家也可以在底部给我留言,对于有价值的留言,我们都会一一回复的。

25a1b8907a2a05196a3920380c9737ff.gif

0b7a5f91df2c44fc7e220e18c60e574b.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cdh集群linux命令,CDH集群中,服务器启动spark2-shell命令行注意事项

1、环境cdh5.12.3spark2 2.3.02、需要本地地洞spark2-shell用于环境测试错误一:Error: A JNI error has occurred, please check your installation and try againException in thread "main" java.lang.NoClassDefFoundError: org/slf4j/Loggerat java.l…

python语音转文字软件_python编写语音转文字软件|语音转文字工具免费版下载(语音批量转换文字) v2.0 最新版_数码资源网...

没有专业的工具怎么能够将语音转换为文字呢?小编为大家提供了语音转文字工具免费版,一款通过Python编写语音转文字软件。用户通过使用语音转文字工具免费版,可以将语音批量转换文字,而且操作也是非常的简单,如果你需要…

Spring-bean作用域scope详解

2019独角兽企业重金招聘Python工程师标准>>> 默认情况下,从bean工厂所取得的实例为Singleton(bean的singleton属性) Singleton: Spring容器只存在一个共享的bean实例,是默认的配置。 Prototype: 每次对bean的请求都会创…

c语言怎么写星星代码,C语言打印星星的问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include int main(void){int index, up, lines;printf("请输入将要显示的行数:\n");while(scanf("%d", &up) 1){if(up % 2 0){for(lines 1; lines < up / 2; lines){for(index 0; index …

c语言计算机猜数字100以内,求一个猜数字C语言代码,要求如下 计算机生成一个100以内的随机数,玩家来猜 记录猜的次数,最后打...

满意答案itpotato推荐于 2017.10.09采纳率&#xff1a;51% 等级&#xff1a;12已帮助&#xff1a;4600人/**百度知道越来越水了&#xff0c;这么简单的题就一个回答*没见过限定头文件数目的。。而且是限定至少。。。。*/#include#include#include#includeint getrand(){sran…

fakeapp2.2.0下载_软件下载 | SuperCuger 测量平差系统 V1.0

SuperCuger测量平差系统 version 1.0 是一款基于测绘工程中边角网、测角网、测边网、水准网测量数据的免费开源的可视化平差系统。可用于测绘工程中测量平差计算和平差结果报告生成&#xff0c;和插件(中间件)模式扩展新的平差功能。我们的软件具备平差数据可视化&#xff0c;便…

c语言cin输入数组,C++基础:各种输入方法总结cin.get()、

原标题&#xff1a;C基础&#xff1a;各种输入方法总结cin.get()、在C中&#xff0c;各种输入方法还是不少的&#xff0c;而且各有所异&#xff0c;本文做一点简要总结&#xff0c;主要涉及如下内容&#xff1a;cin、cin.get()、cin.getline()、getline()、gets()、getchar()。…

手机怎么能把书签导出来_成人高考能在手机上报名吗?成人高考怎么缴费?

很多成人高考的考生在报名考试的时候想用手机进行报名&#xff0c;但是听说都是使用电脑报名&#xff0c;所以不知道手机报名行不行&#xff0c;另外还有很多考生也不知道如何缴费。那么成人高考能在手机上报名吗?成人高考怎么缴费?下面小编就来和大家聊一聊成人高考手机报名…

thinkphp单入口和多入口的访问方法

完全是参考thinkphp的官网资料 现在, 基本上都是 用 单入口 的方式来做的! thinkphp可创建多入口和单入口两种模式&#xff0c;本文主要讲解创建方法和两者的区别。 TP版本&#xff1a;3.1.3 前端&#xff1a;Home&#xff0c;后台&#xff1a;Admin 一. 创建方法 单入口&#…

财务模块的一些基础概念

财务会计承担着企业总体信息管理和传递的职能&#xff0c;无论企业采用何种运营模式、经营何种业务&#xff0c;都离不开财务的支持&#xff0c;大多数运营和管理流程均与财务存在着接口&#xff0c;为此&#xff0c;优化、高效的财务运作模式和流程成为确保企业良性发展和业务…

if mybatis tk 多个_面试题:mybatis 中的 DAO 接口和 XML 文件里的 SQL 是如何建立关系的?...

前言这是 mybatis 比较常问到的面试题&#xff0c;我自己在以前的面试过程中被问到了2次&#xff0c;2次都是非常重要的面试环节&#xff0c;因此自己印象很深刻。这个题目我很早就深入学习了&#xff0c;但是一直没有整理出来&#xff0c;刚好最近一段时间由于工作太忙&#x…

多机器使用setnx 设置同一个key_Redisson分布式锁的简单使用

做一个积极的人编码、改bug、提升自己我有一个乐园&#xff0c;面向编程&#xff0c;春暖花开&#xff01;一&#xff1a;前言我在实际环境中遇到了这样一种问题&#xff0c;分布式生成id的问题&#xff01;因为业务逻辑的问题&#xff0c;我有个生成id的方法&#xff0c;是根据…

孟德尔随机化周报 (12.14)

欢迎报名2023年郑老师团队课程&#xff01; 郑老师科研统计培训&#xff0c;包括临床数据、公共数据分析课程等&#xff0c;欢迎报名 孟德尔随机化,Mendilian Randomization&#xff0c;简写为MR&#xff0c;是一种在流行病学领域应用广泛的一种实验设计方法&#xff0c;利用公…

android计算器弹窗,android实现简易计算器

本文实例为大家分享了android实现简易计算器展示的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下效果图&#xff1a;一、如图&#xff0c;首先布局计算器主页显示activity_main.xmlxmlns:tools"http://schemas.android.com/tools"android:layout_width&qu…

多选取值_机制砂如何控制MB值和石粉含量

随着环保政策的加强和河沙采挖禁令的收紧&#xff0c;机制砂逐渐成为建筑用砂的主流。但很多砂石厂生产设备落后、生产条件简陋、生产工艺不完善导致生产的机制砂品质低&#xff0c;质量不能满足高等级混凝土的要求。不仅卖不上价格&#xff0c;还浪费了矿石资源&#xff0c;挣…

python爬虫哪个选择器好用_Python网络爬虫四大选择器用法原理总结

前几天小编连续写了四篇关于Python选择器的文章&#xff0c;分别用正则表达式、BeautifulSoup、Xpath、CSS选择器分别抓取京东网的商品信息。今天小编来给大家总结一下这四个选择器&#xff0c;让大家更加深刻的理解和熟悉Python选择器。 一、正则表达式 正则表达式为我们提供了…

eclipse配置python开发环境_eclipse怎样搭建Python开发环境

eclipse通过pydev插件也是可以搭建出Python开发环境的。今天小编我就来给大家分享一下eclipse怎样搭建Python开发环境的经验哦。 工具/原料 电脑 eclipse Python pydev插件链接&#xff1a;https://pan.baidu.com/s/1VIK5H_ZbC6DsOlNwy2OwLw 密码&#xff1a;kg8a 方法/步骤 1 …

android光照传感器,详解 android 光线传感器 light sensor的使用

调用anroid的光线传感器使用。实现效果图&#xff1a;MainActivity.Javapackage hk.ust.cse.comp107x.ligthsensor;import android.content.Context;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import …

hive中实现行转列_漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)

全文由下面几个部分组成&#xff1a;先分享一下拉链表的用途、什么是拉链表。通过一些小的使用场景来对拉链表做近一步的阐释&#xff0c;以及拉链表和常用的切片表的区别。举一个具体的应用场景&#xff0c;来设计并实现一份拉链表&#xff0c;最后并通过一些例子说明如何使用…

算法导论:堆排序

堆 堆是一个数组&#xff0c;它可以被看成一个近似的完全二叉树&#xff0c;树上的每一个结点对应数组中的一个元素。除去最底层外&#xff0c;该树是完全充满的&#xff0c;而且从左到右填充。 用数组A表示堆&#xff0c;从数组第1个元素开始&#xff0c;数组中第i&#xff08…