添加console.log后触发Uncaught TypeError的原因及分号影响解析
为什么未加分号时会出现
Uncaught TypeError: console.log(...) is not a function? 问题根源在于JavaScript的自动分号插入(ASI)规则:当你没在console.log("Running")末尾加分号时,引擎不会自动补分号,反而把两行代码合并解析成了一个非法的函数调用:
console.log("Running")(0, user["hello"])()
console.log()的返回值是undefined,你试图把undefined当作函数去调用,自然就抛出了类型错误。
为什么ASI没自动补分号?
ASI的逻辑是:只有当当前行代码和下一行代码拼接后会触发语法错误时,才会自动插入分号。而表达式 + (xxx)在语法上是合法的(表示把前一个表达式的结果当作函数执行),所以引擎认为这是你故意写的连续调用,不会补分号。
加分号后为什么正常?
加了分号;后,两行被明确拆成两个独立语句:
- 执行
console.log("Running")输出内容 - 执行
(0, user["hello"])(),这里的逗号运算符会返回user["hello"]这个函数,然后调用它(此时this指向全局对象/严格模式下为undefined)
这样就不会出现把undefined当函数调用的情况了。
内容的提问来源于stack exchange,提问作者Q10Viking
相关产品推荐
相关产品推荐

