非严格模式下null/undefined作为thisArg会被替换为全局对象,严格模式下保持原值;箭头函数不受影响,实际开发应显式使用globalThis并注意严格模式兼容性。

在 JavaScript 显式绑定(call、apply、bind)中,当传入 null 或 undefined 作为第一个参数(即 thisArg)时,**非严格模式下会自动替换为全局对象(浏览器中是 window,Node.js 中是 global),严格模式下则保持原值(null 或 undefined)不变**。
非严格模式下的默认绑定提升
这是为了“兜底”——避免 this 指向一个无效值而让函数无法正常执行。引擎会主动把 null 和 undefined 升级为全局对象:
-
func.call(null)→this指向window -
func.apply(undefined, [1, 2])→this指向window -
const bound = func.bind(null); bound()→ 调用时this仍为window
严格模式下保持原值不替换
开启严格模式后,JavaScript 不再做隐式兜底,null 和 undefined 就是 this 的真实值:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
"use strict"; func.call(null)→this === null为true -
"use strict"; func.apply(undefined, [])→this === undefined为true - 箭头函数本身不绑定
this,所以显式绑定对其无效,也不受此规则影响
实际开发中的注意事项
这个规则容易引发隐蔽 bug,尤其在跨环境(浏览器/Node/模块打包)或混用严格模式时:
立即学习“Java免费学习笔记(深入)”;
- 不要依赖
null/undefined触发全局对象绑定,应显式传window或globalThis - 使用
bind创建偏函数时,若想确保this为全局对象,建议写成func.bind(globalThis) - 现代代码普遍启用严格模式(如 ES 模块、TypeScript 编译输出),此时
null就是真的null,需主动判断处理
如何安全地统一处理 thisArg
如果需要兼容两种模式并明确控制行为,可以封装一个工具函数:
- 用
globalThis替代硬编码的window或global - 对
null和undefined做显式归一化:thisArg == null ? globalThis : thisArg - 注意:仅在非箭头函数中生效;箭头函数的
this始终由外层作用域决定

















