2017-02-15 36 views
2

在JavaScript中,我不明白下面

var y = 1; 
 
if (function f(){}) { 
 
    y += typeof f; 
 
} 
 
console.log(y);

代码的输出我预计产出将是“1function”。但是,实际输出是'1未定义'。据我所知,函数声明是悬而未决的,如果声明可以访问函数f。但是为什么它打印出未定义的函数还没有被声明?

+4

这不是条件中的函数声明,它是一个命名的函数表达式。函数表达式的名称仅在函数内部可用,因此示例中的“f”在“if”块中完全没有定义。如果您尝试记录'y',则会出现错误。 – Teemu

+0

另请参见http://stackoverflow.com/questions/10069204/function-declarations-inside-if-else-statements –

+0

啊...一个错字,应该是“如果你试图登录'F' ... “ 当然。 – Teemu

回答

2

你不能在一个条件内声明一个函数。只要你把函数声明外,if语句之前,你可以在条件中使用它,其结果将是您预期的那样:

var y = 1; 
 
function f(){} 
 
    if (f) { 
 
    y += typeof f; 
 
    } 
 
    console.log(y);

编辑:嗯,原来你实际上可以(有点*),但不符合所选的符号。这将工作:

var y = 1, f; 
 
    if (f = function(){}) { 
 
    y += typeof f; 
 
    } 
 
    console.log(y);

*为Teemu在评论中指出,这是不是一个真正的函数声明,而是一个匿名函数的引用而被分配给变量f

+1

虽然在第二个片段中还有一个条件中的函数表达式,但这次它是匿名的。你真的不能在需要表达式的地方声明一个函数。 – Teemu

+0

良好的捕获 - 做了一个编辑,以进一步解释这一点。更好? :) – Connum

+0

@downvoter:可能会考虑细节? – Connum