隐式绑定依赖调用时的左侧对象引用,赋值后函数脱离对象上下文,变为独立调用,触发默认绑定:非严格模式下this指向全局对象,严格模式下为undefined。

隐式绑定只在函数被“对象点调用”时生效,一旦把方法赋值给变量,就切断了它和原对象的关联,this 会立刻退回到默认绑定。
为什么赋值后 this 会变?
隐式绑定依赖调用时的“左侧对象引用”。比如 obj.say() 中,obj 是调用主体,所以 this 指向 obj。但当你写成 let fn = obj.say;,此时只是复制了函数的引用,并没有保留任何上下文信息。后续调用 fn() 就变成独立调用,触发默认绑定。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
常见赋值场景及结果
-
变量赋值:
const say = obj.say; say();→this指向window(非严格模式)或undefined(严格模式) -
参数传递:
setTimeout(obj.say, 100);→ 回调中this不再是obj -
数组取值后调用:
const arr = [obj.say]; arr[0]();→ 同样丢失绑定,this失效
怎么避免 this 丢失?
- 调用时手动绑定:
obj.say.call(obj)或obj.say.apply(obj) - 用
bind预绑定:const boundSay = obj.say.bind(obj); boundSay(); - 用箭头函数包装(适合回调):
setTimeout(() => obj.say(), 100); - 在对象定义时用箭头函数(不推荐用于方法,因无法动态绑定)或改用类字段语法 + 箭头函数
本质不是“this 改变了”,而是“原来就没绑定上”——赋值动作让函数脱离了对象上下文,调用时自然按默认规则处理。

















