JavaScript中call绑定this时,非严格模式下null/undefined被自动替换为全局对象,严格模式下则保持原值;箭头函数不受call影响,始终继承外层this;建议启用严格模式并显式传入全局对象。

在 JavaScript 中,使用 call 方法显式绑定 this 时,若传入 null 或 undefined,其行为取决于是否处于严格模式。
非严格模式下的自动装箱
当在非严格模式下调用 func.call(null) 或 func.call(undefined),JavaScript 引擎会将 null 和 undefined 自动替换为全局对象(浏览器中是 window,Node.js 中是 globalThis)。
- 这意味着函数内部的
this实际指向全局对象 - 如果函数内访问
this.a,而全局对象恰好有属性a,就会读取到该值 - 这种隐式转换容易引发意外行为,尤其在模块化或沙箱环境中
严格模式下保持原值
在严格模式(如脚本顶部加 "use strict"; 或函数体中声明)下,call 会如实保留传入的 null 或 undefined 作为 this 值。
function f() { "use strict"; return this; } f.call(null); // 返回 nullf.call(undefined); // 返回 undefined- 此时
this不再被强制转换,更符合直觉和类型安全预期
箭头函数不受 call 影响
箭头函数没有自己的 this,它继承外层作用域的 this 值,因此无论用 call 传什么(包括 null、undefined 或任意对象),都无法改变其 this 绑定。
立即学习“Java免费学习笔记(深入)”;
const arrow = () => this; arrow.call(null); // this 仍是定义时所在上下文的 this- 试图用
call修改箭头函数的this是无效操作
实际开发中的建议
为避免歧义和潜在 bug,推荐以下实践:
- 统一启用严格模式,让
null/undefined的this行为可预测 - 明确需要全局对象时,显式传入
window或globalThis,而非依赖自动转换 - 封装工具函数时,若需兼容旧环境,可先检测并规范化
thisArg:thisArg = thisArg == null ? globalThis : thisArg; - 对箭头函数不使用
call控制this,改用普通函数或调整外层作用域


















