Eval中省略函数参数疑问:Eval("aFunction(,foo)")报错但aFunction(,foo)可运行
为什么
eval("aFunction(,foo)")会报错,但直接调用aFunction(,foo)却能正常运行? 哈哈,这个问题挺有意思的,本质上是JavaScript语法解析规则在不同执行场景下的差异导致的,给你一步步拆解:
1. 先掰扯清楚:标准语法里aFunction(,foo)其实是错的
首先要明确:在现代ECMAScript(ES5及之后)的官方规范里,直接写aFunction(,foo)属于语法错误——函数调用的参数列表不允许出现这种“空着的前置参数位”。你说直接调用能跑起来,大概率是你的代码运行在非严格模式的旧版JS引擎(比如ES3时代的环境)里,这类引擎做了兼容容错,会自动把这个空参数位当成undefined传递给函数。
2. eval()为啥偏要报错?
eval()函数处理传入的字符串时,会严格遵循ECMAScript的语法规范(哪怕你的全局代码是在宽松模式下运行)。当它看到"aFunction(,foo)"这个字符串时,会按照标准语法检查:“哎?参数列表开头怎么有个逗号?这不符合规则啊!”于是直接抛出SyntaxError。
简单总结下区别:
- 直接调用时,旧引擎的兼容逻辑帮你“擦屁股”,把
aFunction(,foo)等价成了aFunction(undefined, foo); - 但
eval()不吃这一套,它严格按规范解析字符串,所以直接报错。
3. 要想让eval()也正常运行怎么办?
很简单,把空参数位明确写成undefined就行,比如:
eval("aFunction(undefined, foo)")
这样既符合标准语法,也能达到和你直接调用一样的效果。
内容的提问来源于stack exchange,提问作者Tim Lai
相关产品推荐
相关产品推荐

