显式绑定对null/undefined的处理取决于严格模式:非严格模式下自动转为全局对象(浏览器window、node.js global),严格模式下保持原值;bind绑定后this不可覆盖;箭头函数无this,继承外层词法环境。

显式绑定(call、apply、bind)对 null 和 undefined 的处理,取决于是否启用严格模式——这是 JavaScript 中最常被忽略但影响深远的细节。
非严格模式下:null/undefined 自动转为全局对象
当函数不在严格模式中运行时,传入 null 或 undefined 作为 thisArg,引擎会自动将其替换为全局对象:
- 浏览器环境 →
this指向window(或self) - Node.js 环境 →
this指向global - 例如:
function(){}.call(null)内部的this就是window -
[1,2].map(x => this, null)中每个回调的this都是window
严格模式下:null/undefined 保持原值
只要函数体顶部有 "use strict",或整个模块默认处于严格模式(ES6 模块),就不会做任何转换:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
-
function(){"use strict"; console.log(this);}.call(null)→ 输出null -
func.apply(undefined)→this就是undefined - 这个行为更符合直觉,也避免了意外依赖全局对象的隐蔽 bug
bind 的特殊性:绑定后不可覆盖
bind 创建的函数会永久锁定 this 值,后续调用无法通过 call 或 apply 改变:
-
const fn = (() => this).bind(null); fn()→ 返回null -
fn.call({x:1})→ 依然返回null,不是{x:1} - 即使在非严格模式下,
bind(null)绑定后,this也不再变成window
箭头函数完全不受影响
箭头函数没有自己的 this,它直接继承外层作用域的 this 值:
-
const arrow = () => this;后续无论.call(obj)还是.apply(null),都无效 - 它的
this取决于定义时的词法环境,和显式绑定无关 - 哪怕外层是严格模式且
this是undefined,箭头函数也照常继承
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










