关于函数声明与函数表达式的差异

function bar() {
    console.log("bar");
}
bar()  //"bar"
var bar = function() {
    console.log("bar");
}
bar()  //"bar"


var bar = function foo() {
    console.log("bar");
}
foo()       //Error

那么这个在function后面的name到底是什么?
还有一点疑惑声明和表达式并不等价

var bar = function() {
    console.log("bar1");
}
function bar() {
    console.log("bar2");
}
bar()

声明函数无法覆盖函数表达式

     function bar() {
        console.log("bar2");
    }
    var bar = function() {
        console.log("bar1");
    }
    bar()
    

但是函数表达式可以覆盖函数声明

阅读 3k
1 个回答

“那么这个在function后面的name到底是什么?”

不能在函数表达式(bar)之外通过真正的函数名(foo)来调用函数,也就是说这个函数名(foo)只能在函数内部使用,比如说递归时,可以通过这个函数名(foo),而不是被赋值为这个函数的变量(bar)来调用

“声明函数无法覆盖函数表达式,函数表达式可以覆盖函数声明”

因为函数与变量都会提升至所在作用域的顶部,且函数先提升。故 bar 变量(函数表达式)可以覆盖 bar 函数(函数声明)

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