下面代码的执行结果是多少(意义不大)

执行结果是多少, 为什么?

var foo = function () {
console.log("foo1")
}
foo()

var foo = function () {
console.log("foo2")
}
foo()


function foo() {
console.log("foo1")
}
foo()

function foo() {
console.log("foo2")
}
foo()

执行结果是:

foo1
foo2
foo2
foo2

原因:
首先,变量foo被赋值为一个函数表达式function () { console.log("foo1") },然后立即调用foo(),输出结果为foo1

接下来,变量foo再次被赋值为另一个函数表达式function () { console.log("foo2") },然后再次调用foo(),输出结果为foo2

然后,函数声明function foo() { console.log("foo1") }被解析并提升到作用域的顶部,但由于变量foo已经被重新赋值为函数表达式,因此这个函数声明不会对变量foo产生影响。

最后,另一个函数声明function foo() { console.log("foo2") }也被解析并提升到作用域的顶部。然后再次调用foo(),由于变量foo指向最后一个函数声明,输出结果为foo2。这也说明了后面的函数声明覆盖了前面的函数声明。