如何实现检测参数是否含undefined的函数?现有实现遇报错求助
如何安全检查变量是否为undefined?
嘿,这个问题我之前也踩过坑!你遇到的ReferenceError不是函数的问题,而是JavaScript的变量解析机制在搞鬼——当你把未声明的变量作为参数传进函数时,JS引擎会先尝试解析这个变量,这一步直接就抛出错误了,你的函数体根本没机会执行。
为什么你的原函数会报错?
看你的示例代码:
let a = 5; let c = "hello"; isDefined(a, b, c); // 这里b是未声明的变量
在调用isDefined之前,JS会先计算所有实参的值。b是一个未被声明的标识符,所以JS直接抛出Uncaught ReferenceError: b is not defined,函数里的循环逻辑完全没机会运行。
解决办法
根据你的需求,分两种场景给你方案:
场景1:检查「未声明的变量」是否存在
如果你要检查的是某个变量有没有被声明,不能直接传变量本身,得换个思路:
- 单个变量检查:用
typeof直接判断(typeof对未声明的变量不会报错,会返回"undefined"):// 检查单个变量 typeof b === "undefined"; // 即使b没声明,也不会报错,返回true - 批量变量检查:把变量名作为字符串传进去,结合作用域对象判断:
这里默认用全局作用域function areVarsDefined(varNames, scope = window) { // 遍历所有变量名,检查是否在指定作用域中存在 return varNames.every(name => name in scope); } // 用法示例 let a = 5; let c = "hello"; areVarsDefined(['a', 'b', 'c']); // 返回false areVarsDefined(['a', 'c']); // 返回truewindow,如果是在局部作用域(比如模块、函数内部),可以传入对应的作用域对象(比如函数里的this,或者用var声明的变量所在的作用域)。
场景2:检查「已声明但未传值的参数」
如果你的需求是检查函数参数是否被传入(比如函数自己的参数,已经被声明但没传值,类型是undefined),那你的原函数是完全有效的!比如:
function myFunc(x, y) { // 检查x和y是否都被传入了值 return isDefined(x, y); } myFunc(1); // 返回false(y是已声明但未传值的undefined) myFunc(1, 2); // 返回true
这种情况不会报错,因为x和y都是函数声明的参数,即使没传值,它们也是存在的,只是值为undefined,你的函数可以正常检查。
内容的提问来源于stack exchange,提问作者Neville Nazerane
相关产品推荐
相关产品推荐

