Rt.
一直有一个疑问,就是forEach
、map
、filter
之类的操作数组的方法,都有一个 array
的可选参数,返回的是当前操作的数组。
但每次使用都需要 arrayData.forEach(...
来执行,所以为什么不直接在回调函数内使用一开始的 arrayData
来用呢?和第三个可选参数 array
的区别是什么?
参数
callback
为数组中每个元素执行的函数,该函数接收一至三个参数:
currentValue
数组中正在处理的当前元素。index
[可选] 数组中正在处理的当前元素的索引。array
[可选]forEach()
方法正在操作的数组。
thisArg
可选 可选参数。当执行回调函数callback
时,用作this
的值。
1
learningman 2021-07-21 10:24:02 +08:00
你可以直接用原型链上的函数原型啊
|
2
VDimos 2021-07-21 10:25:00 +08:00 via Android
因为 js 最开始设计是函数式编程的,属于历史遗留了
|
3
banricho 2021-07-21 10:27:20 +08:00
如果你的 callback 本身是暴露给外部使用的呢?
拿到整个数组,可以方便你获得 length / next item 之类的数据。 |
4
dfkjgklfdjg OP @banricho #3,可以这样写啊
`arrayData.forEach((item,index)=>callback(item,index,arrayData))` 这样写啊。 和 `arrayData.forEach((item,index,array)=>callback(item,index,array))` 的区别是啥? |
5
auroraccc 2021-07-21 10:41:12 +08:00
因为有些情况是:
const cb = (ele, index, array) => do something...; arr1.forEach(cb) arr2.forEach(cb) |
6
banricho 2021-07-21 10:46:11 +08:00
@dfkjgklfdjg
a.js: export const cb = (item, index, arr) => {} --- b.js: import { cb } from './a.js' arrayData.forEach(cb) |
7
banricho 2021-07-21 10:48:04 +08:00
|
8
shakukansp 2021-07-21 11:57:55 +08:00
|
9
hengshenyu 2021-07-21 12:24:36 +08:00 1
arrayData.filter(filterFn).map(mapFn), 当需要在 mapFn 中获取实际的 arrayData 时,你的写法就不行了。
|
10
dfkjgklfdjg OP |
11
hengshenyu 2021-07-21 12:29:12 +08:00
流式处理和函数式总是在一起考虑,参数中增加 arrayData 可以减少对中间值得依赖。使数据流动一气呵成。至于 forEach 为什么也要这样设计,大概是为了写法统一?这个就不知道了
|
12
iOCZ 2021-07-21 12:49:09 +08:00
如果数组是临时数组,没有变量指向呢。。。。🤔
|
13
ericls 2021-07-21 13:03:18 +08:00 via iPhone
Caller 能拿到的东西, callback 不一定拿得到
|
14
Biwood 2021-07-21 13:23:25 +08:00
9 楼正解,很有用的。函数式编程就是可以让你做到逻辑完全分离,也就是说 callback 函数也可以完全分离。想象一下你有可能把 callback 封装在 A 文件里,而 .forEach() 和 .map() 操作在 B 文件里面,这时候他的意义就体现出来了。
|
15
dfkjgklfdjg OP @Biwood #14,链式调用的时候会很方便,(如果不是没办法获得返回的临时数组,其实也可以继续手动传参来处理。
|
16
qyc666 2021-07-21 23:06:52 +08:00
可能还有个优点是 array 变成一个 local variable 查找起来也更快
|
17
dfkjgklfdjg OP @qyc666 #16,勉强算是一个优势吧。
|