为何typeof判断函数f返回undefined?代码结果异常咨询
为什么你的代码会输出
1undefined而非1function? 咱们直接拆解代码逻辑,把问题点讲透:
var y = 1; if (function f(){}) { y += typeof f; } console.log(y);
核心问题:if()括号内的函数是命名函数表达式,名字仅在函数内部有效
你可能误以为function f(){}是普通的函数声明,但实际上当它出现在if()的条件判断括号里时,会被JS引擎解析成命名函数表达式(Named Function Expression,NFE)。
根据ECMAScript规范,命名函数表达式有个关键特性:它的函数名f只绑定在函数自身的作用域内,在括号外部(比如你的if代码块里)完全访问不到。所以当你在if块中执行typeof f时,这里的f属于未定义的变量,自然返回undefined,和初始值1拼接就得到了1undefined。
换两种写法对比,你会更明白
如果把函数声明移到if块外面,结果就符合预期了:
var y = 1; function f(){} // 这是全局作用域下的函数声明,外部可访问 if (f) { y += typeof f; } console.log(y); // 输出:1function
要是非要在if条件里用函数,只有在函数内部才能访问到它的名字:
var y = 1; if (function f(){ console.log(typeof f); }) { // 函数内部能访问f,控制台输出function y += typeof f; // 外部仍访问不到f,结果还是undefined } console.log(y); // 依旧输出1undefined
关于你提到的if块作用域
你说知道if块没有独立作用域,这点完全正确,但这次的问题根源不在if块的作用域,而是命名函数表达式的名字绑定规则——它的标识符不会泄漏到外部作用域,这是JS规范明确规定的。
内容的提问来源于stack exchange,提问作者Deadpool
相关产品推荐
相关产品推荐

