严格模式下,call/apply/bind 传入 null 或 undefined 时 this 保持原值;bind 锁定 this 不可覆盖;箭头函数无 this,继承外层作用域。

在严格模式下,call、apply 或 bind 显式传入 null 或 undefined 作为 thisArg 时,this 就是字面量本身——不会被强制转换为全局对象。
严格模式下 this 保持原值
非严格模式中,null 和 undefined 会被自动替换为全局对象(浏览器中是 window,Node.js 中是 global)。但严格模式关闭了这个“兜底”行为:
-
function(){}.call(null)→this为null -
function(){}.apply(undefined)→this为undefined -
func.bind(null).call({})→ 绑定时this被固定为null,后续调用不可覆盖
bind 的特殊性:绑定后不可再改
bind 创建的函数会永久锁定 this 值,即使之后用 call 或 apply 尝试覆盖也无效:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
const fn = function(){ return this; }.bind(null);-
fn() === null✅ -
fn.call({x:1})仍返回null,不是{x:1}
箭头函数不受影响
箭头函数没有自己的 this,它继承外层作用域的 this,所以显式绑定对它完全无效:
const arrow = () => this;-
arrow.call({a:1})返回的仍是定义时所在上下文的this,不是{a:1} - 即使在外层是严格模式且
this是undefined,箭头函数也照常继承
实际开发中的注意点
这种行为常在工具函数或高阶函数中暴露问题:
- 写通用的
bind封装时,别假设null会变成全局对象 - 测试
this行为时,确保测试环境是严格模式(如模块文件默认就是) - 与第三方库交互时,留意其是否依赖非严格模式下的
this自动转换
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










