关于javascript函数声明的问题

代码一:

foo()
if(true){
    function foo(){
        console.log('a')
    }
}

代码二:

foo()
function foo(){
    console.log('a')
}

代码一为什么报错


代码三:

 if(true){
    foo()
    function foo(){
        console.log('a')
    }
}

javascript并不是以代码段为作用域,而是以函数。
再根据命名提升的原则

chrome代码一没有报错

第一个是作用域链。
第二个可以的原因是函数声明提升,去博客搜

作用域的问题,第一个报错因为你不在同一个代码块内,多了个if判断,ie10-不理会if块,函数直接提升了,直接浏览器会报错,放后面才会调用到的,但是如果是false在后面也会报错,没有执行if生成函数

代码1的函数不是全局函数,只是一个局部函数。函数提升也只是提升到if语句的顶部而已!

首先js确实是以函数为作用域的,if是没有作用于之分的,至于为什么会报错,我看了一下控制台
图片说明

foo确实变量提升到window里面了,但是当运行到foo的时候,所以foo只是一个变量undifined ,,并没有执行到if 里面的语句,调用foo()就会出错,
如果你讲foo放到下面,写成如下。就会输出a了
图片说明