在 JavaScript 中,函数有两种定义方式:函数声明和函数表达式。
函数声明会在当前作用域中创建一个变量,并将其绑定到函数体,可以在变量声明之前调用该函数。例如:
function foo() {
// 函数体
}
函数表达式则将函数定义为一个值,该值可以赋值给一个变量,并且只能在变量声明之后调用该函数。例如:
const foo = function() {
// 函数体
}
在 if…else 语句中使用函数声明会存在变量提升的问题,即在变量声明之前调用函数,导致代码执行时无法正确获取函数体。例如:
if (condition) {
function foo() {
// 函数体
}
} else {
function foo() {
// 函数体
}
}
在上面的代码中,无论是 if 分支还是 else 分支,都使用了同名的函数声明 foo。由于 JavaScript 的变量提升机制,函数声明会被提升到作用域的顶部,因此上面的代码会被解释为:
function foo() {
// 函数体
}
function foo() {
// 函数体
}
if (condition) {
// ...
} else {
// ...
}
这样会导致后面的函数声明覆盖前面的函数声明,因此只有最后一个函数声明会生效。因此,在 if…else 语句中应该使用函数表达式来定义函数,避免变量提升的问题。例如:
let foo;
if (condition) {
foo = function() {
// 函数体
}
} else {
foo = function() {
// 函数体
}
}