为什么下面的代码会返回 "明显的","惊喜!"(最后"怎么回事?").它应该返回"预期",不是吗?
在第一个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需要这种奇特的行为呢?这有什么好处?
不,它不应该,因为函数定义语句的语义不是你显然认为它们的语义.
函数定义语句始终被提升到封闭函数(或范围)的顶部.如果有多个具有相同名称的函数定义语句,则最后一个获胜.这不是一个动态的执行时间.将函数定义语句置于条件代码块中应该在语法上被禁止,但它不是.只是不要这样做.
您当然可以使用函数实例化表达式来创建分配给变量的函数对象.那会像你期望的那样工作.
| 归档时间: |
|
| 查看次数: |
615 次 |
| 最近记录: |