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 更安全