函数声明使用function关键字定义,具有完全提升、独立this、arguments对象、new调用能力和原型链;箭头函数作为表达式,不提升,继承外层this,没有arguments和prototype,不能作为构造函数。两者在语法、作用域及调试支持上存在本质差异。
JavaScript中的函数声明和箭头函数,并非仅仅是“换个写法”那么简单。它们从本质上就是两种不同的定义机制:函数声明创建具名绑定,参与完全提升,如同自带光环的主角;而箭头函数是表达式求值,依赖变量声明规则,默默无闻地跟在后面。深入理解这些区别,有助于避免在代码中踩坑。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
函数声明必须以 function 关键字开头,后跟函数名和括号参数列表,例如:
function greet(name) { return 'Hello, ' + name; }function,也不能用 const/let 去包裹它——谁让它天生就是声明呢箭头函数则恰恰相反,舍弃 function,使用 => 连接参数和函数体:
const greet = (name) => 'Hello, ' + name;id => users.find(u => u.id === id)() => console.log('hi') 或 (a, b) => a + b() => ({ x: 1 })——否则引擎会将其视为函数体块函数声明会经历**完全提升**:函数名和函数体在作用域顶部已经就位,如同提前埋伏好的伏兵:
foo(); function foo() { console.log(1); } —— 正常执行,完全不报错箭头函数本质上是赋值表达式,所以**不提升**:
bar(); const bar = () => {}; —— 直接抛出 ReferenceErrorconst bar = ... 完全一致,只受 const/let 声明规则的约束,在赋值之前访问就是未定义函数声明拥有自己独立的执行上下文(this绑定):
this 由调用方式决定。例如 obj.fn() 中 this 指向 obj,而直接调用 fn() 则指向全局对象(严格模式下为 undefined)arguments 对象、new 调用、prototype 属性——这些是箭头函数不具备的call/apply/bind 任意修改 this,灵活性极强而箭头函数没有自己的执行上下文,直接继承外层词法作用域:
this 是固定的,无论怎么调用、怎么 bind,都指向定义时的外层 thisarguments 对象,要获取参数列表只能用剩余参数 ...argsnew 调用,也没有 prototype 属性——它本质上就是一个轻量化函数函数声明天生具有名称,这对开发体验非常友好:
func.name 返回真实的函数名,在堆栈、断点、性能分析中一目了然function factorial(n) { return n ) —— 不过要小心,这个递归写法有瑕疵,但至少语法上允许箭头函数默认是匿名的:
const fn = () => {}; 之后,fn.name 是空字符串或 'anonymous',取决于引擎实现anonymous,出错时堆栈信息中全是 anonymous,定位问题的难度直接翻倍侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述