JavaScript 函数如何接收并保留参数值,参数接收顺序混乱该如何解决
问题原因
你遇到的参数混乱问题核心是两个调用场景的传参逻辑冲突:
- 把
something直接传给Array.filter做回调时,filter会自动给回调传入3个固定参数:当前遍历的数组元素、元素索引、原数组,这时候你的something接收到的argument2实际上是索引值(数字),这就是你拿到非预期数字的原因。 - 单独调用
something(argumentno2)时,你只传了1个参数,JS会默认把它赋值给第一个参数argument1,第二个参数argument2就变成了空值undefined,符合你遇到的空值问题。
可行解决方案
下面三个方案操作难度都很低,你可以按自己的习惯选:
方案1:用对象参数替代顺序参数(最稳妥,完全避免顺序问题)
把函数参数改成接收一个对象,用属性名区分参数,完全不用管传入顺序:
// 函数定义修改为接收对象参数 function something({ arg1, arg2 }) { // 原有逻辑直接用arg1、arg2即可,不用管传入顺序 }
调用时明确标注对应的参数属性即可:
// 给filter调用时,手动包装参数,指定给arg1 anArray.filter(item => something({ arg1: item })) // 只传第二个参数时,直接指定arg2即可 something({ arg2: argumentno2 }) // 两个参数都传时,顺序随便写都不会错 something({ arg2: '你的字符串值', arg1: 数组运算结果 })
方案2:保留原参数结构,调用时占位
如果不想修改原有函数的参数结构,只需要在只传第二个参数时,给第一个参数位填undefined,同时可以给参数加默认值避免空值异常:
// 函数定义加默认值,避免空值报错 function something(argument1 = null, argument2 = null) { // 原有逻辑不用改 } // 只传第二个参数时,第一个参数位填undefined占位 something(undefined, argumentno2)
方案3:拆分专用调用函数,避免混用冲突
如果两个调用场景完全独立,可以拆成两个专用的调用入口,不用手动记参数规则:
// 原有逻辑保留 function something(argument1, argument2) { // 原有逻辑 } // 给filter用的专用函数 function filterHandle(item) { return something(item, null) // 第二个参数按你的需求填默认值 } // 只传第二个参数的专用函数 function arg2Handle(arg2) { return something(null, arg2) // 第一个参数按你的需求填默认值 } // 调用时直接用对应函数即可,不会出错 anArray.filter(filterHandle) arg2Handle(argumentno2)
内容的提问来源于stack exchange,提问作者Someone
相关产品推荐
相关产品推荐

