javascript this指向如何确定_箭头函数为什么没有this【教程】
技术百科
夢幻星辰
发布时间:2026-01-28
浏览: 次 普通函数的this由调用者决定,箭头函数无this,继承外层普通函数的this;bind/call/apply对箭头函数无效;对象字面量中箭头函数的this不指向该对象,class字段箭头函数因在构造函数中执行而指向实例。
普通函数的 this 是调用时才确定的
不是定义时,也不是写在哪一层作用域里就固定了——关键看「谁调用了它」。比如 obj.method(),this 就是 obj;但把 method 单独提出来赋值给变量再调用,this 就变成 undefined(严格模式)或全局对象(非严格模式)。
常见踩坑场景:
- 事件回调里直接传函数:
btn.addEventListener('click', obj.handleClick)→this不再是obj - 定时器中调用方法:
setTimeout(obj.method, 100)→ 同样丢失this - 数组方法如
map、forEach的回调没显式绑定this,默认是全局或undefined
解决办法常用 .bi、
.call()、.apply(),或者用箭头函数替代(见下一条)。
箭头函数没有自己的 this,它继承外层普通函数的 this
箭头函数不绑定 this,也不支持 call/apply/bind 改变它的 this。它只是「沿作用域链向上找最近的一个普通函数的 this 值」。
立即学习“Java免费学习笔记(深入)”;
注意几个关键点:
- 如果箭头函数最外层没有普通函数(比如直接写在全局作用域),那它的
this就是全局对象(浏览器里是window,Node.js 是global) - 对象方法里写箭头函数,
this不指向该对象,而是指向定义时所在函数的this—— 所以常用于避免回调中this丢失 -
class里定义的箭头函数属性(如handleClick = () => { ... }),this指向实例,因为类体顶层代码其实是在构造函数执行上下文中解析的
示例:
const obj = {
name: 'test',
regular() {
console.log(this.name); // 'test'
setTimeout(function() {
console.log(this.name); // undefined(严格模式)
}, 100);
setTimeout(() => {
console.log(this.name); // 'test',继承 regular 的 this
}, 100);
}
};
bind、call、apply 对箭头函数无效
试图用这些方法强行改箭头函数的 this,不会报错,但也不会生效。因为箭头函数根本没自己的 this 绑定,自然无法被重绑定。
验证方式很简单:
const arrow = () => console.log(this);
arrow.call({x: 1}); // 输出仍是定义时的 this(比如 window),不是 {x: 1}
arrow.bind({y: 2})(); // 同样无效
所以别在箭头函数上白费力气做 bind,要改 this,得换普通函数,或者调整外层函数的调用方式。
容易忽略的边界:对象字面量里的箭头函数和 class 字段
很多人以为「对象里写的箭头函数,this 就是这个对象」,这是错的。对象字面量本身不创建函数执行上下文,里面的箭头函数依然看外层。
比如:
const obj = {
name: 'outer',
fn: () => console.log(this.name)
};
obj.fn(); // 输出 undefined 或 'outer' 取决于外层 this,跟 obj 无关
而 class 中的字段语法(handle = () => {})之所以能绑定实例,是因为它本质是「在构造函数中对实例赋值」,此时外层 this 就是新实例。这和对象字面量的执行时机完全不同。
真正决定箭头函数 this 的,从来不是它「在哪写的」,而是「在哪执行的」——更准确地说,是「它被定义时,所处的最近一个普通函数执行上下文的 this 是什么」。
# 浏览器
# app
# win
# js
# javascript
# java
# class
# 构造函数
# 为什么
# node
# foreach
# 继承
# 作用域
# map
# node.js
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11怎么设置指纹解锁 Win11笔记本录入指
- Windows笔记本无法进入睡眠模式怎么办?(电源
- Mac怎么开启“任何来源”_Mac安装未签名应用的
- php下载安装选zip还是msi格式_两种安装包对
- c++ reinterpret_cast怎么用 c
- Windows10电脑怎么设置文件权限_Win10
- php条件判断怎么写_ifelse和switchc
- c# await 一个已经完成的Task会发生什么
- Windows11怎么自定义任务栏_Windows
- Win11怎么关闭透明效果_Windows11个性
- Mac如何使用听写功能_Mac语音输入打字【效率技
- 如何解决Windows字体显示模糊的问题?(Cle
- 如何在Golang中使用container/hea
- MAC怎么在照片中添加水印_MAC自带编辑工具文字
- Win11怎么开启HDR模式_Windows 11
- 如何在Golang中编写异步函数测试_Golang
- Windows10电脑怎么设置防火墙出站规则_Wi
- Win11怎么连接投影仪_Win11多显示器投屏设
- Python大文件处理策略_内存优化说明【指导】
- Win11声音太小怎么办_Windows 11开启
- Windows Defender扫描失败怎么办_安
- Golang如何测试HTTP中间件_Golang
- LINUX的SELinux是什么_详解LINUX强
- Win11视频默认播放器怎么改_Win11关联第三
- C++如何使用std::optional?(处理可
- PythonFastAPI项目实战教程_API接口
- php增删改查报错1054怎么办_字段名错误排查修
- Win10闹钟铃声怎么自定义 Win10闹钟自定义
- 如何在Golang中使用replace替换模块_指
- Python脚本参数接收_sys与argparse
- Win11开机自检怎么关闭_跳过Win11开机磁盘
- Win11怎么关闭系统推荐内容_Windows11
- GML (Geography Markup Lan
- Win11怎么关闭系统声音_Win11系统提示音静
- mac怎么分屏_MAC双屏显示与分屏操作技巧【指南
- Win11更新后变慢怎么办_Win11系统更新后卡
- 如何在 ACF 中正确更新嵌套多层 Group 字
- MAC如何快速搜索大文件_MAC磁盘空间分析与冗余
- php修改数据怎么批量改状态_批量更新status
- Win11怎么开启远程桌面连接_Windows11
- Windows10如何更改系统字体大小_Win10
- php打包exe如何加密代码_防反编译保护方法【技
- 短链接怎么自定义还原php_修改解码规则适配需求【
- 微信JSAPI支付回调PHP怎么接收_处理JSAP
- Linux如何安装Tomcat应用服务器_Linu
- 用Python构建微服务架构实践_FastAPI与
- Windows音频驱动无声音原因解析_声卡驱动错误
- c++如何使用std::bind绑定函数参数_c+
- Python多线程使用规范_线程安全解析【教程】
- Python正则表达式实战_模式匹配说明【教程】

QQ客服