掌握this绑定的关键是理解“调用方式决定this”,需从识别丢失场景、精准干预手段、箭头函数边界、优先级冲突四维度实战应对。

掌握 JS 中 this 绑定的高级进阶技巧,关键不在死记规则,而在于理解“调用方式决定 this”这一底层逻辑,并能预判、修复和控制绑定行为。下面从四个实战维度展开,直击高频痛点。
识别 this 丢失的真实场景
隐式绑定最容易被破坏,不是因为写法错,而是调用链被截断。常见但易忽略的情况包括:
- 事件监听器中直接传方法:
btn.addEventListener('click', obj.handleClick)→this指向btn而非obj - 定时器回调:
setTimeout(obj.method, 100)→ 独立调用,退化为默认绑定 - 数组方法中的回调:
arr.map(obj.processItem)→processItem被单独执行,this丢失 - 解构赋值后调用:
const { say } = obj; say();→ 同样触发隐式丢失
精准干预 this 的三种可控手段
不依赖箭头函数或 self = this 这类“绕行方案”,而是主动选择最合适的绑定策略:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
-
显式绑定(call/apply):适合一次性调用且需动态传参,如借用原生方法:
Array.prototype.slice.call(arguments) -
硬绑定(bind):适合需要复用、延迟执行的场景,如封装带固定上下文的工具函数:
const logUser = api.log.bind(user, 'INFO') -
new 绑定:构造函数调用时,
this指向新创建的实例,优先级高于显式绑定,可用于实现类工厂或私有作用域隔离
箭头函数的合理边界
箭头函数没有自己的 this,它沿用外层词法作用域的 this 值。但这不等于“万能解药”:
- 在对象方法中滥用箭头函数会破坏隐式绑定:
obj = { fn: () => console.log(this) }→this指向定义时的外层(通常是全局或模块顶层),而非obj - 无法被
call/apply/bind修改,所以不能用于需要动态上下文的工具函数 - 适合场景:回调内需访问外层
this(如 React 类组件的事件处理器、定时器内部访问实例属性)
绑定优先级与冲突处理
当多种绑定同时存在时,按固定顺序生效(从高到低):new 绑定 > 显式绑定(call/apply/bind) > 隐式绑定 > 默认绑定。实战中要注意:
-
bind之后再用call,仍以bind的thisArg为准(硬绑定不可覆盖) -
new一个已用bind固定this的函数,new会覆盖绑定,this指向新实例 - 严格模式下默认绑定返回
undefined,避免意外污染全局,建议所有脚本加"use strict"










