const 定义函数和直接用 function 声明有什么区别
文章类型:Javascript
发布者:hp
发布时间:2025-04-21
在 JavaScript 中,使用 const 定义函数(函数表达式)和用 function 声明函数(函数声明),那么,他们两者有什么不同呢
1:提升上
函数声明=>会被提升到作用域顶部,可以在声明前调用
foo(); // 正常执行
function foo() { console.log("hi"); }
const 定义的函数=>表达式不会被提升。变量名 bar 会提升,但赋值不会,因此提前调用会报错
bar(); // 报错:bar is not a function
const bar = function() { console.log("hello"); };
2:作用域上
函数声明=>在 ES5 中只有全局或函数作用域。非严格模式可能会提升到外层作用域,严格模式下会报错
if (true) {
function func1() {} // 非严格模式可能提升,严格模式报错
}
console.log(func1); // 非严格模式可能访问到
const 定义的函数表达式=>是块级作用域,只能在块内访问
if (true) {
const func2 = function() {};
}
console.log(func2); // 报错:func2 is not defined
3:重复声明上
函数声明=>允许重复定义,后者覆盖前者
function foo() {}
function foo() {} // 正常,覆盖前一个
const 定义的函数表达式=>不允许重复声明
const bar = function() {};
const bar = function() {}; // 报错:Identifier 'bar' has already been declared
4:重新赋值上
函数声明的标识符=>可以被重新赋值
function foo() {}
foo = 123; // 非严格模式允许,但会覆盖函数
const 定义的函数表达式=>不可重新赋值
const bar = function() {};
bar = 456; // 报错:Assignment to constant variable
5:函数名称name属性上
函数声明=>的 name 属性是函数名
function foo() {}
console.log(foo.name); // "foo"
const 定义的匿名函数表达式=>的 name 属性为变量名
const bar = function() {};
console.log(bar.name); // "bar"
1:函数声明适合需要提升或多次定义的场景
2:const 函数表达式适合需要块级作用域、避免意外覆盖的场景
3:let/var 函数表达式允许重新赋值,但 const 更安全