JavaScript 中的 bind()、apply() 和 call()鲜为人知的区别

大厂技术  高级前端  Node进阶

点击上方 程序员成长指北,关注公众号
回复1,加入高级Node交流群

每个开发人员都应该充分了解它们的工作原理,并能够辨别它们之间的细微差别。

所以你知道,JS 函数是一等公民。

这意味着:它们都只是对象值——Function 类的所有实例,具有方法和属性:

7c02bd780a360cde702e26c3c27446fa.png

因此 bind()、apply() 和 call() 是每个 JavaScript 函数都具有的 3 个基本方法。

bind()

你是否和我一起经历过 React 早期的痛苦岁月;那时我们还在使用这样的类组件和事件处理程序?

4ee740af538faa29b9ef993bad7fcff9.png

这只是 bind() 的多种应用之一——一种被严重低估的 JavaScript 方法。

如果没有 bind(),sayName() 会一团糟——alert() 永远无法工作。

因为 React 内部对这个方法做了一些可疑的事情,完全搞砸了 this 内部的含义。

之前 sayName 完全可以毫无问题地显示警报——就像在这个其他类中一样:

f355fd18306a251cf7310a38d5578f07.png

da8cf8f8fb443512e5d7728cf8e5e101.png

但猜猜 React 在幕后对greet事件处理程序方法做了什么?

它将其重新分配给另一个变量:

9bde019de788204ad99e4224783418e6.png

猜猜会发生什么——它无处可寻:

67677e12c1265e68a790cb91d685fde5.png

这就是 bind 发挥作用的地方——它将 this 更改为您选择的任何实例对象:

因此,我们将函数绑定到对象——绑定目标。

(我知道它是“绑定的”,但我们可以说它是绑定的,就像我们将“index”而不是“indices”说成“indexes”一样)。

477fc13d789d14f0408c3d067d105e06.png

它是不可变的——它返回绑定函数而不改变原始函数的任何内容。

这让我们可以尽可能多地使用它:

e84f36cc8a8fbc5f20a0228f0ca7e983.png

vs call()

call 和 bind 之间只有很小的区别。

bind 创建绑定函数供您随意使用。

但是 call?它会动态创建一个临时绑定函数并立即调用它:

fbe2e425da16161f4af27c6fbe203cf9.png

因此, call() 基本上就是 bind() + 一个调用。

但是当函数有参数时怎么办呢?我们该怎么办?

完全没问题 — 只需将它们作为更多参数传递给call即可:

b5ff69d5afda65c7d08410035ea3042e.png

你实际上可以使用 bind() 做同样的事情:

5037a896b535ff92d3efcf96fa55486a.png

vs apply()

一开始你可能会认为 apply() 和 call() 做的事情完全一样:

8712de38ab852f033be50957ccdd737d.png

但就像 bind() 与 call() 一样,需要注意一个细微的差别:

传递的参数:

1579321a106d1df875ea459a99c85f8f.png

我使用一个助记技巧来记住两者的区别:

  • call() 用于逗号

  • apply() 用于数组

回顾总结

  • bind()——绑定到此并返回一个新函数,可重复使用。

  • call()——绑定 + 调用函数,使用逗号传递参数。

  • apply()——绑定 + 调用函数,使用数组传递参数。

Node 社群



我组建了一个氛围特别好的 Node.js 社群,里面有很多 Node.js小伙伴,如果你对Node.js学习感兴趣的话(后续有计划也可以),我们可以一起进行Node.js相关的交流、学习、共建。下方加 考拉 好友回复「Node」即可。

   “分享、点赞、在看” 支持一波👍
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值