默认绑定是函数独立调用时的兜底规则:非严格模式下this指向全局对象(浏览器为window,node.js为global),严格模式下为undefined;它只取决于调用形式,不看定义位置,且被隐式、显式、new及箭头函数规则覆盖。

JavaScript 中默认绑定处理全局函数调用时,核心在于“谁在调用”和“是否启用严格模式”——它不看函数定义位置,只看函数被调用时有没有明确的调用主体。
什么是默认绑定
当一个函数以最普通的方式被调用,既不是作为对象方法(如 obj.fn()),也不是通过 call/apply/bind、new 或箭头函数等方式显式指定上下文,就触发默认绑定。
- 典型写法:fn()、myFunction()、(function(){})()
- 关键特征:调用前没有任何点号(.)、括号前没有对象引用、也没有绑定操作
非严格模式下的行为
在未声明 "use strict" 的环境中,独立调用的函数中 this 指向全局对象:
- 浏览器中是 window 对象,可直接读写 window.x = 1 或 this.x
- Node.js 中是 global 对象
- 即使函数嵌套在另一个函数里,只要不是通过对象调用,仍属默认绑定
严格模式下的变化
一旦启用 "use strict"(可在函数内或脚本顶层声明),默认绑定的 this 不再是全局对象,而是 undefined:
- 对 this 的属性访问会立即报错,例如 this.a = 1 → Cannot set property 'a' of undefined
- 这种设计增强了安全性,避免意外污染全局作用域
- 注意:全局作用域本身(script顶层)的 this 仍为 window,仅函数执行上下文受严格模式影响
常见易错场景
以下情况看似有上下文,实则仍是默认绑定:
- 回调函数脱离对象后单独执行:const cb = obj.method; cb(); → this 不再是 obj
- 定时器中的函数:setTimeout(obj.method, 100) → 执行时是独立调用
- 事件监听器中直接传函数名:btn.addEventListener('click', obj.handleClick) → 点击触发时 this 是 btn(隐式绑定),但若写成 btn.addEventListener('click', () => obj.handleClick()),内部调用仍走默认绑定
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











