javascript如何理解this关键字_它的绑定规则是什么【教程】
技术百科
夜晨
发布时间:2026-01-28
浏览: 次 JavaScript中this调用时绑定:普通调用非严格模式指向全局对象、严格模式为undefined;对象方法调用指向该对象;箭头函数继承外层this;new调用指向新实例;绑定优先级为new>显式绑定>隐式绑定>默认绑定。
JavaScript 中的 this 不是定义时绑定,而是调用时绑定——它永远指向函数被调用时的“执行上下文对象”,和函数在哪定义、怎么声明完全无关。
普通函数调用时,this 指向什么
在非严格模式下,直接调用函数(如 foo()),this 指向全局对象(浏览器中是 window,Node.js 中是 global);严格模式下则为 undefined。
常见错误现象:在回调、定时器或事件处理中直接传入普通函数,this 丢失:
const obj = {
name: 'Alice',
say: function() { console.log(this.name); }
};
setTimeout(obj.s
ay, 100); // 输出 undefined(严格模式)或 window.name
原因:这里 obj.say 被取出来单独调用,等价于 const fn = obj.say; fn();,已脱离 obj 上下文。
- 修复方式:用
bind、箭头函数、或改写为setTimeout(() => obj.say(), 100) - 注意:
call/apply可显式指定this,但只影响当次执行,不改变函数本身
对象方法调用时,this 绑定的是谁
当函数作为对象属性被调用(即 obj.method() 形式),this 指向该对象(obj),这是最直观也最容易依赖的绑定场景。
但要注意“隐式丢失”边界:
-
const fn = obj.method;→ 后续fn()已不是对象方法调用,this不再是obj - 嵌套对象中,只有最后一层点号决定
this:obj.nested.method()的this是obj.nested,不是obj - 原型链上的方法,
this仍指向调用时的实际对象(不是定义它的原型)
箭头函数没有自己的 this,它继承外层作用域
箭头函数不绑定 this,它会沿作用域链向上查找最近的非箭头函数的 this 值,并固定住——无法用 call、apply、bind 改变。
典型使用场景:避免回调中 this 丢失,比如事件监听或 Promise 链:
const obj = {
name: 'Bob',
init() {
document.addEventListener('click', () => {
console.log(this.name); // 正确输出 'Bob'
});
}
};
但这也意味着:箭头函数不能用作构造函数(无 this 实例),也不适合需要动态 this 的场景(如 Vue 或 React 类组件中的事件处理器若需访问实例,有时反而要避免箭头函数)。
new 调用时,this 指向新创建的实例
用 new 调用函数时,引擎会创建空对象,将其设为 this,并隐式返回该对象(除非显式返回其他对象)。
关键点:
- 必须是函数表达式或函数声明,不能是箭头函数(
new箭头函数会报TypeError: xxx is not a constructor) - 构造函数内部若返回一个对象,则以该对象为准;返回原始值(
string/number/etc)会被忽略 -
class语法本质是函数加语法糖,constructor内的this就是即将返回的实例
真正容易被忽略的是:所有绑定规则优先级有明确顺序——new > 显式绑定(bind/call) > 隐式绑定(对象方法) > 默认绑定(普通调用)。而箭头函数根本不在这个链条里,它从定义时就“抄了作业”。
# 浏览器
# app
# win
# js
# javascript
# java
# String
# class
# 构造函数
# node
# 继承
# 处理器
# node.js
# const
# react
# vue
相关栏目:
<?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; ?>
】
相关推荐
- c++的STL算法库find怎么用 在容器中查找指
- Windows10电脑怎么连接蓝牙设备_Win10
- Go 中实现 Python urllib.quot
- 如何在Golang中写入JSON文件_保存结构体数
- Win11怎么关闭任务栏小组件_Windows11
- PHP 中 require() 语句返回值的用法详
- php本地部署后数据库连接报错_1045acces
- Windows10如何重置此电脑_Windows1
- Win11怎么打开旧版计算器_Win11恢复传统计
- Python面向对象实战讲解_类与设计模式深入理解
- MAC如何设置网卡MAC地址克隆_MAC终端修改物
- Python抽象类与接口设计_规范说明【指导】
- Win11怎么关闭系统透明度_Windows11个
- Mac系统更新下载慢或失败怎么办_解决macOS升
- php打包exe后无法读取环境变量_变量配置方法【
- 如何使用Golang构建基础消息队列模拟_Gola
- Win11怎么关闭右下角弹窗_Win11拦截系统通
- Win11屏幕亮度突然变暗怎么解决_自动变暗问题处
- c++中的std::conjunction和std
- php订单日志怎么记录物流_php记录订单物流变更
- How to Properly Use NumPy
- MAC怎么用连续互通相机里的“桌上视角”_MAC在
- Windows如何使用注册表查找和删除项?(reg
- Win11怎么设置默认浏览器Chrome_Wind
- Win11怎么开启上帝模式_创建Windows 1
- windows 10专注助手怎么关闭_window
- Win10怎么卸载金山毒霸_Win10彻底卸载金山
- c++怎么用jemalloc c++替换默认内存分
- Win11怎么设置虚拟桌面 Win11新建多桌面切
- Win10如何更改开机密码_Windows10登录
- c++中的Tag Dispatching是什么_c
- php怎么连接数据库_MySQL数据库连接的基础代
- 如何使用正则表达式批量替换重复的星号-短横模式为固
- 如何使用Golang写入二进制文件_Golang
- 如何诊断并终止卡死的 multiprocessin
- Windows10如何更改任务栏高度_Win10解
- php转mp4怎么保留字幕_php处理带字幕视频转
- Win11怎么更改计算机名_Windows11系统
- Python技术债务管理_长期维护解析【教程】
- Win10怎样卸载TeamViewer_Win10
- 如何正确访问 Laravel 模型或对象的属性而非
- Win10怎么关闭自动更新错误弹窗_Win10策略
- Windows 11无法安全删除U盘提示设备正在使
- 如何高效识别并拦截拼接式恶意域名 spam
- Windows10怎样设置家长控制_Windows
- c# Task.ConfigureAwait(tr
- Win11怎么查看局域网电脑_Windows 11
- Windows怎样关闭桌面弹窗广告_Windows
- Win11声音太小怎么办_Windows 11开启
- MAC怎么解压RAR格式文件_MAC第三方解压工具


QQ客服