console.log(foo) // 输出:undefined
console.log(boo) // 输出:[Function: boo]
// 函数表达式
var foo = function () {
console.log('kkkk')
}
// 函数声明
function boo() {
console.log('bbb')
}
在js代码执行前先对代码进行编译,包括函数和变量在内的声明在编译阶段被处理,因此相对于赋值和其他运行逻辑,声明操作先被处理,这个过程就叫作提升。
以上例子中,函数声明的boo被提升,所以在调用boo时可以被访问,foo仅被声明但未赋值,因此前面访问时为undefined
printName()
function printName() {
console.log('2222')
}
function printName() {
console.log('22223')
}
printName()
var printName = function () {
console.log('11111')
}
printName()
// 输出:
// 22223
// 22223
// 11111
后声明的函数会覆盖前面声明的函数,函数声明优先于普通变量声明。
以上代码中,后面var printName的声明会被忽略,printName在前面被声明为函数,因此第一个printName()可以运行;最后一次运行printName()输出为printName重新赋值后新函数的运行结果