非严格模式下null/undefined被替换为全局对象,严格模式下保持原值;这是es5为提升行为可预测性引入的改进,现代项目普遍采用严格模式。

在 JavaScript 显式绑定(call、apply、bind)中,当传入 null 或 undefined 作为第一个参数(即期望的 this 值)时,非严格模式下会自动替换为全局对象(浏览器中是 window,Node.js 中是 global),而严格模式下则保持原值不变(即 this 真实为 null 或 undefined)。
非严格模式:null/undefined → 全局对象
这是历史遗留行为,目的是让开发者“省心”——即使忘了传有效上下文,函数至少还能访问全局变量。但这也容易引发隐蔽 bug。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
function foo() { return this; }foo.call(null); // 返回 window(浏览器)foo.apply(undefined); // 同样返回 windowconst bound = foo.bind(null); bound(); // 也返回 window
严格模式:null/undefined 保持原样
启用 "use strict" 后,JavaScript 不再做隐式替换,this 就是你传进去的值。
function bar() { "use strict"; return this; }bar.call(null); // 返回 nullbar.apply(undefined); // 返回 undefinedbar.bind(undefined)(); // 返回 undefined
为什么这样设计?
早期 JS 没有严格模式,null 和 undefined 被视为“无意义上下文”,引擎就默认兜底到全局对象。ES5 引入严格模式后,明确要求避免这种隐式转换,让行为更可预测。现代项目普遍使用严格模式(模块脚本默认严格),所以实际开发中遇到 this === null 是完全可能且合法的。
实用建议
- 不要依赖非严格模式下的自动退化,尤其在写库或通用函数时
- 显式传入
thisArg更安全,比如foo.call(obj || window) - 用
bind创建偏函数时,若不确定上下文,可先做空值判断:fn.bind(obj ?? {}) - 检查当前是否为严格模式:可通过
(function(){return this===undefined;})()判断(严格模式下为true)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










