我试图彻底理解回调,这是基本缺失的部分。我在网上搜索了这个答案,但大多数都只是谈论异步回调。
Q 1:为什么像
Array.prototype.forEach()
这样的内置方法使用synchronous callbacks
?这个特性提供了什么优势?
Q 2:当实现我们自己的自定义方法时,我们如何决定是时候使用同步回调了?
背景:
在谈论数组时,javascript的for of
循环在功能上与forEach()
循环完全相同。它们都是从数组的前面循环到末尾。那么,我们为什么两者都需要呢?
总的来说,我看到两个明显的区别是:
- for of循环可以遍历任何可迭代对象,forEach是针对数组的。
- for of循环允许我们使用
continue
和break
关键字,forEach()不 - for of循环不使用回调,
forEach()
使用synchronous callback
。
我明白第一点和第二点的重要性,但我不明白第三点
Q: forEach()以
synchronous
回调作为参数提供了什么优势?
除了"它允许我们对每个元素应用一个函数"之外的答案;或者允许我们"抽象出逻辑"会很有帮助,除非答案实际上就是这么明显,我想得太多了。
希望我的问题是明确和超级清晰的
回调本身并不是同步或异步的。回调函数只是一个函数,作为另一个函数的参数。
当回调被调用时,由函数决定,通常在之前会有其他事件。如果该事件本身是异步的,那么调用也是异步的。
这与forEach
和for
完全分开。两者存在的原因,可能是下列因素的结合:
for(.. of ..)
已经不存在很长一段时间了,for(.. in ..)
有一些与原型相关的令人惊讶的行为。这导致许多库实现了功能(for)each
,最著名的是jQuery。- 人们喜欢jQuery
each
的另一个jQuery时代的原因是,很多人对变量在作用域/闭包和循环中的行为感到困惑。做一个函数式的版本,可以更容易地避免在之前的迭代中覆盖闭包变量。 最后,有些人喜欢使用循环函数的想法。
特别是前两个原因使$.each
流行,以至于在语言中添加了本地forEach
。
今天使用forEach
的理由更少了,因为:
forEach
与await
不兼容- 我们现在有块作用域
let
和const
,所以每次循环迭代后变量覆盖不再是一个问题。 for(... of ..)
做人们期望的(不需要hasOwnProperty
)。- 你不能"打破"
forEach
如果上面的子弹不是一个问题,一些人仍然选择使用forEach
。我不完全明白,但是你真的不能争论风格。