我正在处理一些典型的Javascript采访问题,并且遇到了这个问题。我对答案和解释感到困惑,并且想知道是否有人可以更深入地加以表述。
下面的代码输出是什么?
var y = 1;
if (function f() {}) {
y += typeof f;
}
console.log(y);
说明: 输出将是1undefined。 if条件语句使用eval求值,因此eval(function f(){})返回函数f(){}(这是真的)。因此,在if语句内部,执行typeof f返回未定义,因为if语句代码在运行时执行,并且if条件内部的语句在运行时求值。
答案 0 :(得分:3)
if条件语句使用eval求值
不,一点也不。 if
条件中包含一个函数表达式,并且函数(像所有Javascript对象一样)是真实的。
函数表达式本身(不同于函数声明-即function fnName() { ...
本身)不会导致函数在当前作用域中接收变量名,因此看不见f
作为变量名称-只是函数表达式的函数名称。
函数表达式在if
条件内被评估为真,然后不再被引用。在代码的任何位置范围内都没有名为f
的变量,因此typeof f
解析为undefined
(typeof f
会解析为undefined
,无论它放置在什么位置那里的代码。)
相反,如果f
是单独的函数声明,则会创建名为f
的变量名(因此typeof f
将导致function
):
var y = 1;
function f() {}
if (true) {
y += typeof f;
}
console.log(y);