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
相关产品推荐
相关产品推荐

