JS函数参数校验:实现非函数类型(含undefined)传入时抛出错误
解决参数类型校验问题:非函数参数(含undefined)抛出错误
我来帮你搞定这个问题!你的核心需求很明确:只要传入的参数不是函数类型——不管是显式传undefined、不传参,还是传字符串/数字这类非函数值——都要捕获并抛出错误。
原代码的问题分析
你原来的判断条件if (fn && typeof fn !== 'function')有个关键漏洞:当fn是undefined(不管是不传参还是显式传undefined)时,fn属于假值,fn &&这部分会直接返回false,导致整个条件不成立,自然不会触发错误抛出逻辑。这就是为什么test()和test(undefined)都没报错的原因。
修改后的完整代码
function test(fn) { // 直接校验参数类型:只要不是函数就抛错 if (typeof fn !== 'function') { throw new Error('The argument must be a valid function'); } console.log(fn); return fn; } function demo() {} // 以下调用都会触发错误(符合预期) test(); // 不传参,fn为undefined test(undefined); // 显式传入undefined test('sdfasfs'); // 传入字符串 // 只有传入函数时正常执行 test(demo);
改动说明
- 简化判断逻辑:去掉了多余的
fn &&校验,直接用typeof fn !== 'function'覆盖所有非函数场景。因为typeof undefined返回的是'undefined',和'function'不相等,所以不管是不传参、显式传undefined,还是传其他非函数类型,都会触发错误。 - 明确错误信息:把
throw Error();改成带具体描述的错误,这样调试时能快速知道问题出在哪,比空错误对象友好得多。
这样修改后,就完全符合你的需求了——所有非函数类型的参数(包括undefined)都会抛出错误,只有传入函数时才会正常执行。
内容的提问来源于stack exchange,提问作者Sahin Erbay
相关产品推荐
相关产品推荐

