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; ?>
】
相关推荐
- 如何使用 Python 合并文件夹内多个 Exce
- 如何在Mac上搭建Golang开发环境_使用Hom
- c++如何打印函数堆栈信息_c++ backtra
- Win11视频默认播放器怎么改_Win11关联第三
- VSC怎么配置PHP的Xdebug_远程调试设置步
- php和redis连接超时怎么办_phpredis
- Win11怎么退出微软账户_切换Win11为本地账
- Go 中 := 短变量声明的类型推导机制详解
- Windows10系统怎么查看系统版本_Win10
- php错误怎么开启_display_errors与
- 如何用正则表达式精确匹配“start”到“end”
- MAC如何设置网卡MAC地址克隆_MAC终端修改物
- Win11如何更改用户账户文件夹名称 Win11修
- Windows10怎么查看系统激活状态_Windo
- PHP 中如何在函数内持久修改引用变量所指向的目标
- 使用类变量定义字符串常量时的类型安全最佳实践
- php订单日志权限怎么设_php订单日志文件权限设
- Win11怎么设置默认邮件应用_Windows11
- Win10怎样清理C盘浏览器缓存_Win10清理浏
- Linux怎么查找死循环进程_Linux系统负载分
- 如何使用Golang包导出规则_控制函数和变量可见
- 如何使用正则表达式批量替换重复的星号-短横模式为固
- Win11怎么修复系统文件_使用sfc命令修复Wi
- Python路径拼接规范_跨平台处理说明【指导】
- c++怎么使用std::tuple存储多元组数据_
- 如何优化Golang内存分配与GC调度_Golan
- PHP中require语句后直接调用返回对象方法的
- Mac怎么开启“任何来源”_Mac安装未签名应用的
- Win11如何设置省电模式 Win11开启电池节电
- Linux如何使用Curl发送请求_Linux下A
- PythonWeb前后端整合项目教程_FastAP
- Win11怎么清理C盘虚拟内存_Win11清理虚拟
- Win11怎么设置DNS服务器_Windows11
- Win11右键反应慢怎么办 Win11优化右键菜单
- Drupal 中 HTML 链接被重复转义导致渲染
- Windows10怎么用“讲述人”读屏辅助 Win
- Windows系统时间服务错误_W32Time服务
- Windows10蓝屏SYSTEM_SERVICE
- Win10怎样安装Excel数据分析工具_Win1
- 如何在 Go 中正确反序列化 XML 多节点数组(
- MAC如何启用访达侧边栏显示_MAC Finder
- php8.4xdebug无法调试怎么办_php8.
- 如何使用Golang实现错误包装与传递_Golan
- Win11玩游戏全屏闪退怎么办_Win11全屏优化
- php嵌入式日志记录怎么实现_php将硬件数据写入
- Windows10怎么备份注册表_Windows1
- 如何在Golang中实现自定义Benchmark_
- Python集合操作技巧_高效去重解析【教程】
- Mac如何与安卓手机传文件_Mac和Android
- C++如何解析JSON数据?(nlohmann/j

QQ客服