函数定义的两种方式

130 阅读1分钟
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重新赋值后新函数的运行结果