CEF3 Eval执行JS报Illegal return statement错误解决方案
CEF3 Eval执行JS时顶层作用域非法return的无嵌套解决方案
报错原因
JS语法规定return关键字仅能在函数作用域内使用,你通过Me.webkitx1.Eval()传入的代码默认运行在全局顶层作用域,不存在外层函数上下文,直接写return会直接抛出Uncaught SyntaxError: Illegal return statement语法错误。
可选实现方案(无多层if嵌套)
以下两种写法都能实现你要的逻辑,不会产生嵌套冗余:
方案1:最小改动适配(推荐,原有代码几乎不用改)
给整个执行的代码块套一层立即执行的匿名函数(IIFE),函数内部的return完全符合语法规范,不会污染全局作用域,CEF3的V8引擎完美兼容:(function() { var element = document.querySelector("*[autofocus]"); if (!element) { element = document.querySelector("form input:not([type=hidden])"); } if (!element) return; // 此处return合法,无语法报错 element.selectionStart = element.selectionEnd = element.value.length; element.focus(); var y = element.getBoundingClientRect().top + window.scrollY; window.scroll({ top: y, behavior: "smooth" }); })();原来代码里的空if块可以直接删掉,判断逻辑反过来写即可,代码更简洁。
方案2:运算符短路实现(无额外函数包裹)
利用JS逻辑运算符的短路特性,不需要return就能实现元素不存在时截断后续逻辑,代码更短:// 优先找带autofocus的元素,找不到再找表单里的非隐藏输入框 // 低版本CEF不支持??空值合并运算符的话,换回原来的if赋值逻辑即可 const element = document.querySelector("*[autofocus]") ?? document.querySelector("form input:not([type=hidden])"); // 仅当element存在时才执行后续聚焦、滚动逻辑,无需写else分支 element && (element.selectionStart = element.selectionEnd = element.value.length) && element.focus() && window.scroll({ top: element.getBoundingClientRect().top + window.scrollY, behavior: "smooth" });
内容的提问来源于stack exchange,提问作者tmighty
相关产品推荐
相关产品推荐

