javascript函数如何定义_什么是箭头函数?
发布时间 - 2026-01-05 00:00:00 点击率:次普通函数用function关键字定义,支持命名、匿名、IIFE等形式,具this/arguments动态绑定且会被提升;箭头函数是语法糖,不绑定this/arguments,适合词法绑定场景,不可作构造函数。
普通函数怎么写?function 关键字是基础
JavaScript 里最常规的函数定义方式,就是用 function 关键字。它支持命名、匿名、立即执行等多种形式,也允许在函数体内使用 this、arguments 和 new.target 等动态绑定特性。
常见写法示例:
function add(a, b) {
return a + b;
}
const multiply = function(x, y) {
return x * y;
};
// 立即执行函数表达式(IIFE)
(function() {
console.log('run once');
})();
注意点:
-
function声明会**提升(hoist)**,可以在
定义前调用;而 function表达式不会 - 函数内部的
this值取决于**调用方式**(如obj.fn()中this指向obj),不是定义位置 -
arguments对象可访问传入的所有参数,箭头函数里没有这个对象
箭头函数为什么没 this?它不绑定执行上下文
箭头函数(() => {})本质是函数表达式的语法糖,但它**不创建自己的 this、arguments、super 或 new.target**——这些全部从外层作用域继承。所以它不能用作构造函数(调用会报 TypeError: xxx is not a constructor),也不能用 call/apply/bind 改变 this。
典型误用场景:
- 对象方法写成箭头函数 →
this指向外层,不是当前对象 - 事件回调中需要访问实例属性,却用了箭头函数 → 实际访问的是定义时的作用域
- 想用
arguments处理不定参数 → 箭头函数里根本不存在arguments
正确替代方式:
const obj = {
value: 42,
// ❌ 错误:this 指向外层(通常是 global 或 undefined)
badMethod: () => console.log(this.value),
// ✅ 正确:普通函数,this 指向 obj
goodMethod() {
console.log(this.value);
},
// ✅ 箭头函数可用在需要稳定 this 的地方(如 setTimeout 回调)
delayedLog() {
setTimeout(() => {
console.log(this.value); // this 正确继承自 delayedLog 的调用上下文
}, 100);
}
};
=> 写法有哪些简写规则?参数和返回值可以省略括号和花括号
箭头函数的语法灵活,但省略规则有明确优先级:单参数可省 (),单表达式可省 {} 和 return,但一旦涉及多语句、解构、默认参数或需要显式返回对象字面量,就必须加括号或花括号。
常见写法对比:
-
x => x * 2→ 单参数 + 单表达式,隐式返回 -
(x, y) => x + y→ 多参数必须加() -
x => ({ id: x })→ 返回对象字面量,必须用小括号包裹,否则会被解析为代码块 -
([a, b]) => a + b→ 参数解构必须加() -
(x = 1) => x→ 默认参数也必须加()
容易踩坑的写法:
// ❌ 你以为返回 { name: 'Alice' },实际返回 undefined(被当成了代码块)
x => { name: 'Alice' }
// ✅ 正确写法:用括号包裹对象字面量
x => ({ name: 'Alice' })
// ✅ 或者显式写 return
x => { return { name: 'Alice' }; }
什么时候该用箭头函数?别只图写得短
箭头函数不是“更现代的替代品”,而是解决特定问题的工具:**需要词法绑定 this 和 arguments 的场景**。它适合用在回调、闭包、高阶函数参数里;不适合用在对象方法、原型方法、构造器、事件处理器(除非你明确控制了 this 绑定)。
判断依据很简单:
- 是否需要
this指向调用者?→ 用普通函数 - 是否希望
this和外层一致(比如类中方法内嵌的定时器回调)?→ 用箭头函数 - 是否要通过
new调用?→ 只能用普通函数 - 是否要兼容 IE?→ 箭头函数不支持 IE,需 Babel 编译
性能上几乎没有差异,但语义清晰更重要。混淆两者最常导致的 bug 是:对象方法意外写成箭头函数后,this 变成 undefined,访问属性时报 Cannot read property 'xxx' of undefined。
# javascript
# java
# go
# 处理器
# app
# 工具
# 作用域
# 为什么
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
香港服务器WordPress建站指南:SEO优化与高效部署策略
Laravel如何处理CORS跨域请求?(配置示例)
移动端脚本框架Hammer.js
Laravel如何实现API版本控制_Laravel版本化API设计方案
如何快速配置高效服务器建站软件?
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
如何快速启动建站代理加盟业务?
Laravel如何为API编写文档_Laravel API文档生成与维护方法
实例解析Array和String方法
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
Laravel Fortify是什么,和Jetstream有什么关系
Laravel如何处理文件下载请求?(Response示例)
Laravel如何实现本地化和多语言支持?(i18n教程)
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
微信小程序 require机制详解及实例代码
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
Python函数文档自动校验_规范解析【教程】
如何挑选优质建站一级代理提升网站排名?
JavaScript Ajax实现异步通信
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
Laravel怎么使用Intervention Image库处理图片上传和缩放
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
如何制作一个表白网站视频,关于勇敢表白的小标题?
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
如何自定义建站之星模板颜色并下载新样式?
linux top下的 minerd 木马清除方法
Laravel如何优化应用性能?(缓存和优化命令)
如何确保FTP站点访问权限与数据传输安全?
Laravel如何配置任务调度?(Cron Job示例)
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
油猴 教程,油猴搜脚本为什么会网页无法显示?
如何用5美元大硬盘VPS安全高效搭建个人网站?
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
nodejs redis 发布订阅机制封装实现方法及实例代码
JavaScript实现Fly Bird小游戏
如何在云主机上快速搭建网站?
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
如何在景安服务器上快速搭建个人网站?
Laravel如何使用Blade组件和插槽?(Component代码示例)
如何在IIS中新建站点并配置端口与物理路径?
javascript读取文本节点方法小结
动图在线制作网站有哪些,滑动动图图集怎么做?
Laravel如何与Pusher实现实时通信?(WebSocket示例)
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】


定义前调用;而