为什么函数声明不会覆盖函数表达式?

var bar = function () {
    console.log(4);
};
function bar() {
    console.log(5);
}

bar();//4
阅读 4.4k
5 个回答

先反对下上面那个等效代码:var bar; //bar is undefined
之所以产生变量提升是因为执行上下文的创建阶段早于执行阶段,而创建阶段里function声明又优先于var声明,此时需要注意:同名的函数会覆盖,同名的变量只会跳过,因此等效代码如下:

function bar() {
    console.log(5);
}
var bar; //这句会被跳过
bar = function () {
    console.log(4);
};

以上,bar is undefined的情况不会出现

变量提升,等效代码如下:

var bar; //bar is undefined
function bar() {
    console.log(5);
}
bar = function () {
    console.log(4);
};

===================
有个地方我说错了,参照楼下的回答,函数声明的执行顺序高于变量声明,所以第一行var bar是不会有的,不改了,放在这里提醒你们吧

代码:

var bar = function () {
    console.log(4);
};
function bar() {
    console.log(5);
}

bar();//4

# 引擎渲染:

第一步

var bar ; // 变量提升
function bar() {  // 变量提升
    console.log(5);
}

第二步

bar = function () { // 再赋值
    console.log(4);
};

第三部步

bar(); // 输出 : 4

建议看《you don't know js》

推荐问题
宣传栏