赋值导致this丢失,因函数引用被复制后脱离原对象,调用时无左侧对象触发隐式绑定,退为默认绑定;常见于变量赋值、解构、回调传参等场景。

变量赋值是引发隐式绑定丢失最典型、最频繁的场景。本质在于:赋值操作提取的是函数本身,切断了它与原对象的关联。
为什么赋值会导致 this 丢失
当写 const fn = obj.method 时,JavaScript 只把函数引用复制给了 fn,并不保留“它是从哪个对象来的”这一上下文信息。后续调用 fn() 时,已无左侧对象参与,无法触发隐式绑定,只能退回到默认绑定。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
常见赋值丢失形式
-
直接赋值给变量:
const handleClick = obj.handleClick; handleClick();—— 此时this不再指向obj -
解构赋值:
const { handleClick } = obj; handleClick();—— 同样丢失绑定,原理相同 -
数组解构取方法:
const [fn] = [obj.method]; fn();—— 函数被单独取出,脱离对象 -
参数传递(本质也是隐式赋值):
setTimeout(obj.callback, 100)或button.addEventListener('click', obj.handleClick)—— 回调被传入后由系统调用,调用时无对象前缀
怎么验证是否丢失
可在方法内部加一句 console.log(this === obj)。赋值后调用返回 false,就确认丢失了。
避免丢失的常用办法
-
调用时显式绑定:
const handleClick = obj.handleClick.bind(obj); -
使用箭头函数包装:
const handleClick = () => obj.handleClick(); -
在使用处直接调用(不提前赋值):
button.addEventListener('click', () => obj.handleClick()); -
ES6 方法简写 + class 字段语法(类中):
handleClick = () => { ... },天然绑定到实例
核心记住一点:隐式绑定只看调用时的“左边是谁”,而不是函数“原本属于谁”。只要调用形式变成 fn() 而不是 obj.fn(),绑定就没了。










