关于Array.map()传入命名函数作为回调的运行机制疑问
Array.map() 回调函数运行原理解析
你困惑的核心是搞混了「传入函数引用」和「直接调用函数」的区别,下面一步步拆解逻辑:
1. map() 需要的是函数引用,不是函数执行结果
你一开始想写的cats.map(toUpper(string))是错误的,原因有两点:
- 这里的
string未定义,直接写会抛出变量未声明的错误; - 就算定义了
string,toUpper(string)会立即执行并返回一个字符串,而map()要求传入的回调必须是函数,不是字符串,此时map运行时会因回调类型错误报错。
而cats.map(toUpper)是把toUpper函数的引用传给map,相当于告诉map:“你遍历数组的时候,每次都用这个函数处理元素”。
2. map() 会自动调用回调并传参
当map遍历数组时,每处理一个元素,都会自动调用你传入的回调函数(也就是toUpper),并且按固定顺序传入三个参数:
- 当前正在处理的数组元素(对应
toUpper里的string参数) - 当前元素的索引
- 原数组本身
这就是你用arguments看到那三个值的原因——map在调用toUpper时,自动把这三个参数传进去了。比如遍历第一个元素"Leopard"时,map实际执行的是:
toUpper("Leopard", 0, ["Leopard", "Serval", "Jaguar", "Tiger", "Caracal", "Lion"])
toUpper函数里只用到了第一个参数,所以后面的索引和原数组参数有没有写在函数定义里都不影响,map依然会传递它们。
3. 完整运行流程
- map开始遍历
cats数组的第一个元素"Leopard"; - 调用
toUpper,传入"Leopard"、0、原数组; toUpper接收第一个参数,返回"LEOPARD";- map把这个返回值存入新数组;
- 重复步骤1-4,直到遍历完所有元素;
- map最终返回由所有大写字符串组成的新数组,赋值给
upperCats。
内容的提问来源于stack exchange,提问作者luis.madrigal
相关产品推荐
相关产品推荐

