文档章节

从一行等式理解JS当中的call, apply和bind

孟飞阳
 孟飞阳
发布于 2018/04/20 10:03
字数 726
阅读 6
收藏 0

关于JS当中的call,apply和bind,相信大家和我一样,已经看过了无数篇相关的文章,都有自己的理解。所以这篇文章并非什么科普类的文章,仅仅是把我自己的理解记录下来。

我的学习习惯,是喜欢把各种看似孤立的知识点串联起来,综合理解并运用,通过最简单最直观的思路把它理解透。所以,这篇文章将通过一段非常简洁的等式,把JS当中一个相对较难的知识点,call,apply和bind给串联起来:

从一行等式理解JS当中的call, apply和bind

要理解JS当中的这三个关键字,首先得弄清楚它们是用来干嘛的。复杂些来说,可以引用MDN文档的原文:

从一行等式理解JS当中的call, apply和bind

简单些来说,可以引用大家都看过的一句话:

从一行等式理解JS当中的call, apply和bind

又或者是

从一行等式理解JS当中的call, apply和bind

上面这些解释都很正确,说得一点问题都没有,但是里面却又引入了

从一行等式理解JS当中的call, apply和bind

这个猫对象拥有一个抓老鼠的技能catchMouse()

然后类似的,定义一个狗对象:

从一行等式理解JS当中的call, apply和bind

这个狗对象能够咬坏人biteCriminal()

接下来,我们实例化两个对象,分别得到一只叫“Kitty”的猫和叫“Doggy”的狗:

从一行等式理解JS当中的call, apply和bind

首先让它们彼此发挥自己的技能:

从一行等式理解JS当中的call, apply和bind

现在,我们希望赋予Doggy抓老鼠的能力,如果不使用这三个关键字,应该怎么做呢?

方案A:修改Dog对象,直接为其定义一个和Cat相同的抓老鼠技能。

方案B:让Doggy吃掉Kitty,直接消化吸收Kitty的所有能力。

其实方案A和方案B的解决办法是类似的,也是需要修改Dog对象,不过方案B会更简单粗暴一点:

从一行等式理解JS当中的call, apply和bind

上面这种方法实在是太不优雅,往往很多时候在定义Dog对像的时候根本就没有打算过要为它添加抓老鼠的方法。那么有没有一种办法能够在不修改Dog对象内容的前提下,让Doggy实例也能够拥有抓老鼠的办法呢?答案就是使用call,apply或者bind关键字:

从一行等式理解JS当中的call, apply和bind

反过来,让Kitty拥有咬坏人的能力,也可以通过这种办法实现,读者可以自行尝试。

看到这里,相信读者已经能够明白call,apply和bind的区别及作用,反过来再查看各自的概念,应该也能够更容易理解。

回到文章开头的等式:

从一行等式理解JS当中的call, apply和bind

这里的“等号”其实并不严谨,因为三个关键字的区别及背后的原理肯定不是区区一个等号就能够概括的,但是对于概念的理解以及实际情况下的运用来说,这条等式未必不是一个好的思路。

本文转载自:https://www.toutiao.com/i6540575067284177411/

共有 人打赏支持
孟飞阳
粉丝 212
博文 998
码字总数 550537
作品 5
朝阳
个人站长
私信 提问
Javascript 中的上下文

js 中的 上下文 Context,可以说是一个,你即使不知道,没听过,也不影响你继续写 js 代码的一个概念。但是,它又确确实实是无所不在的一个东西,是的,无所不在。 从我自己的经验来看,对上...

五大三粗
2015/05/10
0
0
JavaScript初学者必看“this”

译者按: JavaScript的和Java等面向对象语言中的大不一样,、和函数更是将的灵活度进一步延伸。 原文: JavaScript: The Keyword ‘This’ for Beginners 译者: Fundebug 为了保证可读性,本文...

Fundebug
2017/05/17
0
0
JS每日一题: Call,Apply,Bind的使用与区别,如何实现一个bind?

20190115问: Call,Apply,Bind的使用与区别,如何实现一个bind? 相同点: 都是使用于方法借用及明确this指向场景 第一个参数都是this要指向的对象 都可以利用后续参数传参 不同点: 参数传递...

JS每日一题
01/23
0
0
趣谈js的call和apply两大召唤术

前言 在《趣谈js的bind牌胶水》这篇文章中,我聊到了js的bind胶水,这篇文章我来聊聊js的call和apply这对孪生兄弟。 Why? ——> 为什么会出现apply和call? 在《趣谈js的bind牌胶水》中,我...

hanmin
2018/05/21
0
0
妙用Javascript中apply、call、bind

这篇文章实在是很难下笔,因为网上相关文章不胜枚举。 巧合的是前些天看到阮老师的一篇文章的一句话: “对我来说,博客首先是一种知识管理工具,其次才是传播工具。我的技术文章,主要用来整...

孟飞阳
2018/04/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

rabbitmq安装教程

RabbitMQ有Windows与Linux版本的,这里先写Windows版本的安装。 以前安装软件总是在百度上找某某安装教程,结果能按照教程安装好的软件真的不多。想起先前以为大牛说的一句话,去官网按照官网...

em_aaron
今天
6
0
Android 贝塞尔曲线实践——波浪式运动

一、波浪效果如下 贝塞尔曲线自定义波浪效果的案例很多,同样方法也很简单,大多数和本案例一样使用二次贝塞尔曲线实现,同样还有一种是PathMeasure的方式,这里我们后续补充,先来看贝塞尔曲...

IamOkay
今天
3
0
Nmap之防火墙/IDS逃逸

选项 解释 -f 报文分段 --mtu 指定偏移大小 -D IP欺骗 -sI 原地址欺骗 --source-port 源端口欺骗 --data-length 指定发包长度 --randomize-hosts 目标主机随机排序 --spoof-mac Mac地址欺骗 ...

Frost729
今天
2
0
带你搭一个SpringBoot+SpringData JPA的环境

不知道大家对SpringBoot和Spring Data JPA了解多少,如果你已经学过Spring和Hibernate的话,那么SpringBoot和SpringData JPA可以分分钟上手的。 其实我在学完SpringBoot和SpringData JPA了之...

java菜分享
今天
7
0
Chocolatey 在Window搭建一个开发环境

在看了(利用 Chocolatey 快速在 Windows 下搭建一个开发环境)后,准备从零开始 一、准备工作 1、用管理员权限启动:powershell,执行错误请参考(PowerShell因为在此系统中禁止执行脚本的解...

近在咫尺远在天涯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部