默认绑定仅适用于独立调用的函数(如foo()),与定义位置无关;非严格模式下this指向全局对象(globalthis),严格模式下为undefined。

默认绑定在非全局上下文中,其实并不存在——“默认绑定”这个概念本身就只适用于**独立调用的函数**,且其发生场景天然排除了对象方法、构造调用、显式绑定等上下文。所谓“非全局上下文”,比如函数嵌套在另一个函数里、或定义在模块中、或作为回调传入,只要它被**直接调用(不带任何调用者对象)**,就仍触发默认绑定规则。
默认绑定的本质是“无主调用”
它不看函数在哪定义、嵌套多深、是否在模块内,只看运行时如何被调用:
- 如果形如
foo(),没有点号(.)、没有new、没有call/apply/bind,就是默认绑定 - 此时 this 的值由是否启用严格模式决定:非严格模式 → 全局对象(浏览器为
window);严格模式 →undefined - 即使函数写在立即执行函数(IIFE)内部、或 ES 模块顶层、或某个类的方法里,只要以
fn()方式调用,就走默认绑定
常见误判场景:看似“非全局”,实则仍是默认绑定
很多人以为“在函数内部定义的函数就不会默认绑定”,但实际逻辑不变:
-
function outer() { function inner() { console.log(this); } inner(); }→inner()是独立调用,this 仍按默认规则处理 -
const obj = { method() { setTimeout(() => console.log(this), 0); } };中的箭头函数继承外层 this,但若换成普通函数:setTimeout(function() { console.log(this); }, 0),该回调函数仍是独立调用,触发默认绑定 - ES 模块中顶层的函数调用(如
myUtil()),因模块作用域不是“全局执行上下文”,但该调用仍属独立调用,所以依然适用默认绑定(非严格模式下 this 指向globalThis,而非模块作用域)
为什么模块环境不影响默认绑定?
ES 模块顶层代码运行在模块作用域,不是全局作用域,但 JavaScript 引擎对默认绑定的判定不依赖“所在作用域”,而依赖“调用表达式结构”:
-
globalThis是统一的全局对象引用,无论代码在 script、模块还是 worker 中,foo()在非严格模式下,this依然指向globalThis(浏览器中等于window,Node.js 中等于global) - 模块的“顶层
this为undefined”仅指模块脚本自身最外层的this值,不影响其中定义的函数被独立调用时的绑定行为
验证方式很简单
只需检查调用形式,无需关心函数位置:
- 写个函数
function check() { return this; } - 在任意嵌套层级中写
console.log(check()); - 非严格模式下输出
window(或globalThis),严格模式下输出undefined—— 这就是默认绑定在“非全局上下文”中真实发生的逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











