小编典典

if / else语句中的函数声明?

javascript

函数声明如何处理?

var abc = '';
if(1 === 0){
    function a(){
        abc = 7;
    }
}else if('a' === 'a'){
    function a(){
        abc = 19;
    }
}else if('foo' === 'bar'){
    function a(){
        abc = 'foo';
    }
} 
a();
document.write(abc); //writes "foo" even though 'foo' !== 'bar'

此示例在Chrome和Firefox中产生不同的输出。Chrome输出,foo而FF输出19


阅读 433

收藏
2020-04-25

共1个答案

小编典典

当问这个问题时,ECMAScript5(ES5)盛行。在ES5的严格模式下,函数声明不能​​嵌套在一个if块中,如问题所示。在非严格模式下,结果是不可预测的。不同的浏览器和引擎针对如何处理块内的函数声明实现了自己的规则。

许多浏览器都支持ECMAScript2015(ES2015),以至于现在在block中允许使用函数声明。在ES2015环境中,块内的函数声明将作用于该块内。问题中的代码将导致未定义的函数错误,因为该函数a仅在if语句范围内声明,因此不存在于全局范围内。

2020-04-25