对象字面量中方法调用触发隐式绑定而非默认绑定,this指向调用该方法的对象;脱离点号调用(如赋值、回调、解构)则退回到默认绑定;箭头函数不参与this绑定,继承外层词法作用域;严格模式下默认绑定使this为undefined,利于提前暴露错误。

默认绑定不适用于对象字面量内部的函数调用——只要函数是通过对象属性语法(即“点号”或“方括号”)被调用的,就触发的是隐式绑定,而非默认绑定。
对象字面量中方法调用走的是隐式绑定
当写成 obj.method() 时,JavaScript 引擎识别出这是“对象发起的调用”,this 自动绑定到 obj,与默认绑定无关。哪怕 method 是在对象字面量里直接定义的,也不改变这一规则。
- 例如:
const user = { name: 'Tom', say() { console.log(this.name); } }; user.say();→ 输出'Tom',this 指向 user - 即使嵌套多层:
const app = { ui: { btn: { click() { console.log(this); } } } }; app.ui.btn.click();→ this 指向 btn 对象,不是 app 或 ui
什么时候会从隐式退回到默认绑定?
关键看“调用形式”是否还保留对象上下文。一旦脱离点号调用,隐式绑定失效,就会降级为默认绑定。
-
赋值后调用:
const fn = user.say; fn();→ 此时 fn 是独立函数调用,触发默认绑定(非严格模式下 this === window) -
作为回调传入:
setTimeout(user.say, 100);→ 同样丢失对象关联,this 指向全局或 undefined(严格模式) -
解构后调用:
const { say } = user; say();→ 等价于赋值,也触发默认绑定
箭头函数在对象字面量里不参与 this 绑定
如果方法写成箭头函数:const obj = { name: 'Alice', greet: () => console.log(this.name) };,那么它根本没有自己的 this,而是继承外层作用域的 this 值(通常是模块顶层的 this,即 undefined 或 window),这和默认绑定无关,属于词法绑定行为。
严格模式下默认绑定更“安全”但更易报错
在对象方法内部若意外触发默认绑定(比如把方法单独拿出来调用),严格模式会让 this 变成 undefined,从而让错误提前暴露;非严格模式则悄悄指向 window,容易引发静默 bug(如 this.name 取到全局变量)。
- 建议:在文件顶部加
"use strict";,或使用现代模块(ESM 默认严格模式) - 避免依赖默认绑定逻辑,对可能脱离上下文的函数显式绑定:
setTimeout(user.say.bind(user), 100)或改用箭头包装:setTimeout(() => user.say(), 100)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











