全局上下文中的 this 指向 window,因为浏览器将全局对象实现为 window,函数在全局中独立调用时默认绑定到该全局对象;严格模式下默认绑定使 this 为 undefined,以增强安全性。

全局上下文中的 this 指向 window,不是“约定俗成”,而是 JavaScript 执行环境的底层设计决定的——浏览器把全局对象实现为 window,而函数在全局中独立调用时,this 就被自动绑定到这个全局对象上。
默认绑定触发的条件
当一个普通函数被直接调用,既没有点号前缀(如 obj.fn()),也没有 new、call、apply 或 bind,就进入默认绑定规则。
-
function foo() { console.log(this); }→foo()触发默认绑定 - 自执行函数
(function(){ console.log(this); })();同样属于默认绑定 - 定时器回调
setTimeout(function(){ console.log(this); }, 100)中的函数也是独立调用,适用默认绑定
为什么是 window 而不是别的对象?
因为浏览器环境的全局对象就是 window。它不只是一个变量,而是整个执行上下文的顶层宿主对象,所有全局声明(var、函数声明、未声明直接赋值)都会成为它的属性。
console.log(this === window); // true-
var a = 1;等价于window.a = 1; - 所以 this 在默认绑定下指向
window,本质上就是指向“当前执行环境的全局对象”
严格模式下的例外
一旦启用 "use strict",默认绑定不再兜底到全局对象,而是让 this 保持为 undefined。
- 这是为了防止意外修改全局对象,提升安全性
"use strict"; function foo() { console.log(this); } foo(); // undefined- 注意:全局作用域本身不受影响(
this在顶层脚本中仍为window),只影响函数内部
容易混淆的几个点
默认绑定只看“谁在调用”,不看函数在哪定义或嵌套多深。
- 对象方法里定义的内层函数,如果独立调用,this 仍是
window(非严格模式) const obj = { fn() { (function(){ console.log(this); })(); } }; obj.fn(); // window- 箭头函数不参与默认绑定——它根本没自己的 this,直接沿用外层函数的 this 值











