对象属性赋值本身不触发默认绑定,关键在于右侧表达式是否为独立函数调用:如foo()、iife或解构后调用method()等;严格模式决定this值为undefined或全局对象;箭头函数则始终继承外层词法this。

对象属性赋值本身不会触发函数的默认绑定,但当赋值操作中**右侧表达式包含函数调用**,且该调用满足独立调用条件时,才可能进入默认绑定。关键不在“赋值”动作,而在“函数如何被调用”。
赋值语句里藏着的函数调用
JavaScript 赋值操作(=)只负责把右边的值存到左边变量或属性中。它不改变函数内部的 this 绑定规则。但如果右边是一个函数调用,比如:
-
obj.x = foo();→ 这里foo()是独立调用,触发默认绑定 -
obj.x = bar.call(null);→call(null)属于显式绑定,this被设为null,但非严格模式下会被忽略,退回到默认绑定 -
obj.x = (function(){ return this; })();→ IIFE 是典型默认绑定场景
解构赋值 + 函数调用的陷阱
常见误判点出现在解构赋值中混入函数调用:
-
const { method } = obj; const result = method();→method已脱离obj,属于赋值后调用,走默认绑定 -
const { fn } = { fn: function(){ console.log(this); } }; fn();→ 同样是独立调用,this指向全局或undefined
注意:赋值过程本身没有 this,出问题的是后续对所赋值函数的调用方式。
严格模式决定默认绑定结果
函数体是否启用严格模式,直接决定默认绑定的 this 值:
-
function f() { "use strict"; return this; }→f()返回undefined -
function g() { return this; }→g()在浏览器中返回window - 即使赋值发生在严格模式模块内(如 ES6 模块),只要函数定义本身没写
"use strict",其默认绑定仍按非严格模式处理
箭头函数在赋值中的特殊性
箭头函数没有自己的 this,它的 this 始终由外层词法作用域决定,与赋值位置无关:
-
const obj = { a: 1, getThis: () => this }; const fn = obj.getThis; fn();→this取决于getThis定义时的外层上下文,不是obj,也不是默认绑定 - 哪怕写成
obj.prop = () => this;,赋值后调用依然沿用定义时的this,不会因“独立调用”变成默认绑定
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











