You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

eval定义函数后typeof判断异常:为何返回undefined而非function?

为什么输出是1undefined而不是1function?

这个问题的核心在于eval执行函数表达式的作用域规则,咱们一步步来拆解原因:

首先,你写的eval(function foo(){})里,function foo(){}是作为函数表达式被eval处理的,而非函数声明。当一个函数直接作为参数传递给eval时,它会被解析成表达式,而非独立的声明语句。

函数表达式里的名称foo,作用域仅仅局限于这个函数的内部——也就是说,eval执行完这个表达式后,当前的if块作用域里并不会创建foo这个变量,外部自然无法访问到它。

你提到eval(function(){})的typeof结果为function,这是因为eval执行函数表达式时,返回值就是这个函数本身,所以typeof eval(function(){})确实会得到function,但这和函数名称是否暴露到外部作用域完全是两回事。

再回头看你的代码:

var k = 1;
if (1) {
  eval(function foo(){}); // foo仅在这个函数表达式内部可见
  k += typeof foo; // 当前作用域不存在foo,所以typeof返回undefined
}
console.log(k);

如果想让foo在外部作用域可见,你需要让eval执行的是函数声明语句,比如把函数包裹成字符串传入:

var k = 1;
if (1) {
  eval("function foo(){}"); // 此时eval执行的是函数声明,foo绑定到当前作用域
  k += typeof foo; // 这里typeof foo就是function了
}
console.log(k); // 输出1function

简单总结:你代码中的foo是函数表达式的内部名称,无法被外部作用域访问,因此typeof foo返回undefined,最终拼接后得到1undefined。

内容的提问来源于stack exchange,提问作者Deadpool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:40:32