无函数封装的JS脚本如何实现提前返回,避免重复执行?
全局脚本的顶层作用域下不支持直接写return语句,直接执行会抛出语法错误,但可以通过以下两种改动极小的方案实现你要的early return效果,不需要修改原有业务代码,也不需要套大的if块。
建议将示例中的标记变量名替换为和你的脚本强相关的唯一名称,避免和其他脚本的标记冲突。
方案1:IIFE包装(最推荐)
仅需在脚本首尾各加一行代码,即可支持在开头直接写return终止执行,原有业务代码完全不需要调整:
// 脚本最开头加这一行 (function () { if (window.this_script_have_been_loaded) return window.this_script_have_been_loaded = true // 此处粘贴所有原有脚本代码,不需要做任何修改 // 脚本最末尾加这一行 })()
优势:无多余控制台报错,逻辑完全符合预期,维护成本极低。
方案2:主动抛出错误终止执行
如果连IIFE的首尾两行都不想加,可直接在脚本开头通过throw终止当前脚本执行,不需要修改后续任何代码:
if (window.this_script_have_been_loaded) { // 抛出的错误只会终止当前脚本执行,不会影响其他页面逻辑 throw 'Script already loaded' } window.this_script_have_been_loaded = true // 此处粘贴所有原有脚本代码,不需要做任何修改
优势:仅需修改脚本开头3行,完全不需要动后续代码。缺点是控制台会留下一条报错记录,不影响功能运行,仅对控制台纯净度有要求的场景不适用。
特殊情况:ES模块脚本
如果你的脚本是通过加了type="module"属性的script标签引入的ES模块,模块顶层天然支持return语句,直接写即可:
if (window.this_script_have_been_loaded) return window.this_script_have_been_loaded = true // 原有代码
内容的提问来源于stack exchange,提问作者eloyesp
相关产品推荐
相关产品推荐

