关于JavaScript自定义forEach函数中回调函数传参的疑问
解惑自定义forEach中函数传参的差异
先给你拆解清楚核心差异:你传递的是「函数本身」还是「函数调用的结果」,这是关键!
先回顾你的自定义函数核心逻辑:
Array.prototype.myLoop = function(func) { for(let i = 0; i < this.length; i++) { func(this[i]); // 这里会主动给传入的func传递当前数组项作为参数 } }
1. 为什么传alert不需要额外声明参数?
alert本身就是一个内置函数,它的定义就是接受一个参数(要弹出的内容)。当你写myArray.myLoop(alert)时,你传递的是alert这个函数的「引用」——相当于告诉myLoop:“你循环的时候就调用这个alert函数就行”。
当myLoop执行func(this[i])时,相当于直接调用alert(this[i]),alert会自动接住这个参数并弹出内容,所以你不需要手动给alert传参,因为myLoop已经帮你完成了传参动作。
2. 为什么匿名函数需要声明参数?
你写的匿名函数function(color) { console.log(color); },本质是一个「自定义的参数接收容器」。如果不声明color这个参数,函数内部就没有变量能拿到myLoop传递过来的this[i],那console.log()就会输出undefined。
这里的color只是参数的名字,换成item、val都没问题,它的唯一作用就是「接住」myLoop传过来的数组项,让你能在函数内部使用这个值。
3. 为什么myArray.myLoop(alert(color))会出问题?
这是新手常踩的坑:你在这里不是传递alert函数本身,而是先调用了alert(color),然后把调用后的结果传给myLoop。
- 首先,
color在这里是未定义的变量,浏览器会直接抛出ReferenceError: color is not defined; - 就算你之前定义过
color,alert()函数执行后返回的是undefined,myLoop拿到的func就是undefined,当它执行func(this[i])时,就会抛出TypeError: func is not a function——因为你没法调用一个非函数的值。
总结一下:
- 要传递「函数本身」作为参数时,直接写函数名(比如
alert、匿名函数表达式); - 函数的参数是用来接收调用方(这里的
myLoop)传递过来的值的,按需声明即可; - 不要把函数调用的结果(比如
alert(color))当成函数传进去,除非你确定这个调用返回的是另一个函数。
内容的提问来源于stack exchange,提问作者WoodenChops
相关产品推荐
相关产品推荐

