将函数作为参数传入另一函数,生成onclick按钮时出现语法错误如何解决
错误原因
报错的核心是字符串拼接生成行内事件代码时语法完全不合法,具体有两个直接诱因:
- 你没有给
funcTwo的第一个参数补全引号闭合规则:拼接的代码片段是funcTwo(+argFunc+','+customMsg+),第一个参数左半边没有加单引号,右半边多了个单引号,直接导致整个onclick属性的引号配对完全混乱,浏览器解析到半截识别不到合法的结束符,就抛出Unexpected end of input错误。 - 就算你补全了引号,把函数对象直接序列化拼进行内事件里也没法正常执行:函数转字符串后会携带花括号、换行、符号等内容,和行内事件的上下文语法冲突,且你把函数序列化成字符串当参数传递后,
funcTwo接收到的是字符串而不是函数对象,后续调用argFunc(customMsg)还会抛出argFunc is not a function的错误。
解决方案
最稳妥的方案是放弃字符串拼接生成HTML+行内事件的写法,改用DOM API创建元素、通过事件绑定API注册回调,利用闭包直接保留参数引用,完全规避字符串拼接的语法问题:
function funcOne(argFunc, customMsg) { let div = document.createElement('div'); // 直接创建button元素,不用拼接字符串 let button = document.createElement('button'); button.textContent = 'Go!'; // 绑定点击事件,闭包直接捕获入参的argFunc和customMsg button.addEventListener('click', () => { funcTwo(argFunc, customMsg); }); div.appendChild(button); document.body.appendChild(div); } function funcTwo(argFunc, customMsg) { argFunc(customMsg); }
调用逻辑不用修改,直接执行就能得到预期效果。
内容的提问来源于stack exchange,提问作者Ami
相关产品推荐
相关产品推荐

