console.clear()后接自调用函数触发is not a function报错问题
错误原因
这是JavaScript自动分号插入(ASI)规则导致的经典语法解析问题:console.clear()行尾没有手动写分号时,JS引擎不会在这行自动插入分号终止语句,会跳过中间的空行、单行注释,把下一行立即执行函数开头的(,判定为对console.clear()返回值的函数调用。
实际解析后的等价逻辑是:
console.clear()(function () { console.table(countries) })()
console.clear()的返回值是undefined,对undefined做函数调用自然会抛出console.clear(...) is not a function的类型错误。
移除后面的立即执行函数后,没有了后续的括号调用语法,console.clear()会被识别为独立语句,所以能正常执行,控制台输出清屏成功的提示。
验证方法
哪怕不写完整的立即执行函数,只要在console.clear()后紧跟括号包裹的内容,都会触发相同错误,比如:
console.clear() (1)
运行后会抛出完全一致的报错,和当前遇到的问题原理完全相同。
解决方案
二选一即可:
- 给
console.clear()行尾补上分号,明确标记语句结束:
console.time('for of loop') for(const country of countries){ console.log(country.name, country.capital) } console.timeEnd('for of loop') console.clear(); // Level 1. (function () { console.table(countries) })()
- 如果习惯不写行尾分号,就在所有以
(、[、/(正则开头)等特殊符号起始的语句前,手动加一个前置分号,避免和上一行语句粘连解析:
console.time('for of loop') for(const country of countries){ console.log(country.name, country.capital) } console.timeEnd('for of loop') console.clear() // Level 1. ;(function () { console.table(countries) })()
注意:单行注释、空行都不会阻断JS引擎的连续语句解析,不要依赖空行或者注释来分隔语句。
内容的提问来源于stack exchange,提问作者Lord Dickenstein
相关产品推荐
相关产品推荐

