JS函数在if语句中的奇怪行为,为什么?

Fil*_*kor 3 javascript jquery

为什么下面的代码会返回 "明显的","惊喜!"(最后"怎么回事?").它应该返回"预期",不是吗?
在第一个if我们使用匿名函数,在第二个我们使用'命名'函数.

var a = 5;
if (a == 5) {
    var b = function () {
        return "obvious";
    };
} else {
    var b = function () {
        return "never";
    };
}

if (a == 5) {
    function c() {
        return "expected";
    }
} else {
    function c() {
        return "surprise!";
    }
    function d() {
        return "how come?";
    }
}

alert(b());
alert(c());
alert(d());
Run Code Online (Sandbox Code Playgroud)

所以这意味着,function a(){} is NOT equal to var a = function (){}.

那么,第二个问题,为什么JS需要这种奇特的行为呢?这有什么好处?

Poi*_*nty 7

不,它不应该,因为函数定义语句的语义不是你显然认为它们的语义.

函数定义语句始终被提升到封闭函数(或范围)的顶部.如果有多个具有相同名称的函数定义语句,则最后一个获胜.这不是一个动态的执行时间.将函数定义语句置于条件代码块中应该在语法上被禁止,但它不是.只是不要这样做.

您当然可以使用函数实例化表达式来创建分配给变量的函数对象.那会像你期望的那样工作.