JS中IIFE代码报TypeError:{(intermediate value)}不是函数的原因咨询
为什么这段代码会抛出
TypeError: {(intermediate value)(intermediate value)(intermediate value)} is not a function? 这个错误的核心原因是JavaScript自动分号插入(ASI)机制在这里没有帮你补充分号,导致引擎把代码解析成了完全错误的结构。
咱们先拆解下你的代码:
var sam = { name :"san", age:56, lastname:"tom" } (({name,lastname})=>{ console.log(name); console.log(lastname); })(sam);
JavaScript引擎会把这段代码错误地解析成:
var sam = ( { name :"san", age:56, lastname:"tom" } ( ({name,lastname})=>{ ... } ) )(sam);
简单来说,它误以为你是在调用前面的对象字面量(把{...}当成了一个函数),先把箭头函数作为参数传进去“调用”这个对象,接着又把sam作为参数调用这个“调用结果”——但对象本身根本不是函数,自然就抛出了“不是函数”的类型错误。
为什么ASI没生效?
ASI的规则里有个关键例外:如果下一行代码以(开头,引擎不会在当前行末尾自动插入分号。它会默认你是在延续当前的表达式(比如函数调用、分组表达式),而不是结束一个语句。
怎么修复?
只需要在对象字面量的末尾手动加上分号,明确告诉引擎这个语句已经结束:
var sam = { name :"san", age:56, lastname:"tom" }; (({name,lastname})=>{ console.log(name); console.log(lastname); })(sam);
手动加分号是最可靠、最清晰的做法,能彻底避免这类ASI相关的语法坑。
内容的提问来源于stack exchange,提问作者Santhosh Kumar




