在 Chrome 和 Firefox 中运行它会给出不同的答案:
(function() {
if(true) {
function f() { alert("yes"); };
} else {
function f() { alert("no"); };
}
f();
})();
在 Chrome 中,结果是“否”
在 Firefox 中,结果是“是”
为什么有区别?
在条件语句内声明函数是非标准的,所以不要那样做。这是一个已知问题。您可以使用函数表达式代替声明:
var f;
if(true) {
f = function() { alert("yes"); };
} else {
f = function() { alert("no"); };
}
f();
The 关于函数表达式的著名 Kangax 文章给出了一些额外的细节:
函数声明只允许出现在Program or 函数体。从句法上来说,他们不能出现在Block ({ ... })
——比如if
, while
or for
声明。这是因为Blocks只能包含声明, not 源元素, which 函数声明 is.
同一篇文章还说:
值得一提的是,根据规范,允许实现引入语法扩展(参见第 16 节),但仍完全符合要求。这正是当今许多客户所发生的情况。其中一些将块中的函数声明解释为任何其他函数声明 - 只需将它们提升到封闭范围的顶部;其他——引入不同的语义并遵循稍微复杂的规则。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)