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

这是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!')
    }
}
阅读 2.9k
5 个回答

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

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

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

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

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

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

和写的

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

没有本质区别

  • 预解释:在当前作用域下,JS代码执行之前,首先会把带var/function关键字的进行提前的声明(declare)或者定义(defined)。

  • 带var关键字的在预解释阶段只完成了提前的声明;b.带function关键字的在预解释阶段完成了声明和定义两个操作。

  • 注意几点:

    • 1.不管条件判断是否成立,判断体中的内容都要进行预解释;

    • 2.预解释的时候只对"="等号左边的变量进行预解释,右边代表的都是值,是不进行预解释的;

    • 3.在全局作用域下预解释的时候,自执行函数中的function是不参与的,当代吗执行到对应的区域后,声明、定义、执行一起完成;

    • 4.虽然函数体中return下面的代码是不执行的,但是需要进行私有作用域下的预解释,而return后面的是返回值,是不进行预解释的;

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题