JavaScript输入校验函数用label跳转报错,求单出口实现方案
单出口输入校验函数的跳转问题解决
问题描述
想要编写一个用户输入校验函数,需求如下:
- 无错误时返回
true - 存在错误时返回
false并展示错误信息 - 发现错误后立即终止后续校验,跳转到函数末尾统一处理错误展示与格式化
编写的代码如下:
let ValidateInput = function() { let errorMessage = ""; if (input1 == "") { errorMessage = "Something"; continue exithere; } if (input2 == "") { errorMessage = "Something else"; continue exithere; } exithere: if (errorMessage != "") { //Display error //Change error <p>'s format by adding classlist } }
使用continue或break跳转到label时,触发错误提示**“Jump target cannot cross function boundary .ts(1107)”**,但label明明在函数内部。虽可以在每个判断后用return false;,但希望保持函数单出口,仅在一处统一处理错误,寻求解决办法。
解决方法
方法1:利用try/catch实现跳转
用try块包裹校验逻辑,发现错误时抛出自定义标记,catch块捕获后直接进入后续错误处理,既中断校验又保证单出口:
let ValidateInput = function() { let errorMessage = ""; try { if (input1 === "") { errorMessage = "Something"; throw 'exit'; } if (input2 === "") { errorMessage = "Something else"; throw 'exit'; } } catch (e) { // 只处理自定义的退出标记,不拦截其他异常 if (e !== 'exit') throw e; } // 统一错误处理 if (errorMessage !== "") { // 展示错误信息 // 给错误<p>添加样式类 return false; } return true; }
方法2:标志位控制流程
设置hasError布尔变量,一旦出错就标记为true,后续校验先判断该标志位,跳过不必要的检查:
let ValidateInput = function() { let errorMessage = ""; let hasError = false; if (!hasError && input1 === "") { errorMessage = "Something"; hasError = true; } if (!hasError && input2 === "") { errorMessage = "Something else"; hasError = true; } // 统一错误处理 if (hasError) { // 展示错误信息 // 给错误<p>添加样式类 return false; } return true; }
方法3:自执行函数包裹校验逻辑
把校验逻辑放在立即执行函数中,出错时直接return跳出该函数,继续执行后续统一错误处理:
let ValidateInput = function() { let errorMessage = ""; (function validate() { if (input1 === "") { errorMessage = "Something"; return; } if (input2 === "") { errorMessage = "Something else"; return; } })(); // 统一错误处理 if (errorMessage !== "") { // 展示错误信息 // 给错误<p>添加样式类 return false; } return true; }
原代码报错原因
JavaScript/TypeScript中,continue仅能用于循环语句(for/while等);break虽可跳转label,但label必须关联循环或switch语句,不能直接放在普通代码块前。你原代码的exithere:直接放在if语句前,不符合语法规则,导致break/continue无法识别该跳转目标,从而报错。
内容的提问来源于stack exchange,提问作者bbProg
相关产品推荐
相关产品推荐

