显式绑定时传入null或undefined,非严格模式下this降级为全局对象,严格模式下保持原值;开发中应避免依赖降级,推荐显式传globalThis。

当使用 call、apply 或 bind 显式绑定 this,且传入 null 或 undefined 时,JavaScript 会按规则“降级”处理:在非严格模式下,自动 fallback 到默认绑定(即指向全局对象 window 或 globalThis);在严格模式下,则**不降级**,this 就保持为 null 或 undefined。
非严格模式:null/undefined → window
这是最常见的降级行为。只要没启严格模式,无论你传 null 还是 undefined,引擎都会把它替换成全局对象:
function fn() { console.log(this); }<br>fn.call(null); // Window(浏览器)或 global(Node.js)fn.apply(undefined); // 同样输出全局对象const bound = fn.bind(null); bound(); // 依然指向全局对象
严格模式:不降级,保持原值
一旦函数或调用上下文处于严格模式,null 和 undefined 就不会被替换:
"use strict";<br>function fn() { console.log(this); }<br>fn.call(null); // null<br>fn.call(undefined); // undefined- 注意:不是整个脚本严格模式才生效,哪怕只在立即执行函数中启用,也会影响其内部的显式绑定行为
实际开发中的注意事项
这种降级看似方便,但容易引发隐蔽 bug,尤其在跨环境(浏览器/Node.js)或混用严格模式时:
- 避免依赖降级逻辑,显式传
globalThis更清晰 - 在工具函数或库中,若需兼容两种模式,可先检测:
const ctx = thisArg == null ? globalThis : thisArg; - 数组方法如
[].forEach(fn, null)在非严格模式下this是window,这点常被忽略
本质是语言设计的历史妥协,现在推荐明确传递上下文,而不是靠降级兜底。


















