搜索

首页  >  问答  >  正文

javascript - 看到函数声明这块有个函数不是很理解

这是js高程上面的一个例子
看到函数声明有一个代码

if(condition){
    function sayHi(){
        alert('hi')
    }
}else{
    function sayHi(){
        alert('Yo')
    }
}

说是这段代码无效语法,大多数浏览器会返回第二个声明,firefox会返回第一个声明,这是为什么?
如果改成函数表达式形式的就可以了,这又是为什么?

var sayHi;
if(condition){
    sayHi=function(){
        alert('Hi')
    }
}else{
    sayHi=function(){
        alert('Yo!')
    }
}
我想大声告诉你我想大声告诉你2732 天前806

全部回复(4)我来回复

  • 黄舟

    黄舟2017-07-05 10:40:34

    因为第一个是函数声明, 但是一般不会放在if-else中声明函数

    第二个是把匿名函数赋值给变量 ,不存在提升之类的

    回复
    0
  • 黄舟

    黄舟2017-07-05 10:40:34

    直接写function xxx(){} 会导致声明提前,如果有两个同名的这样的函数,相当于在顶部执行了两次var xxx,所以无效

    回复
    0
  • 伊谢尔伦

    伊谢尔伦2017-07-05 10:40:34

    和什么声明前置没有关系,高程第三部那时候JavaScript规范还都是ES5,浏览器还没有实现块级作用域(ES2016+),作用域级别只是函数级别的。所以你写的

    if(condition){
        function sayHi(){
            alert('hi')
        }
    }else{
        function sayHi(){
            alert('Yo')
        }
    }

    和写的

    function sayHi(){
      alert('hi')
    }
    function sayHi(){
      alert('Yo')
    }

    没有本质区别

    回复
    0
  • PHP中文网

    PHP中文网2017-07-05 10:40:34

    js是有声明提前的!!!function会在声明时直接提到作用域顶端。if中不存在作用域,所以两个function是一个作用域,第二个会替掉第一个。! 而你第二段代码,先声明了变量sayhi,在if判断后才对sayhi进行赋值,

    回复
    0
  • 取消回复