默认绑定下,非严格模式this指向全局对象(浏览器window/node.js global),严格模式下为undefined;典型误判包括函数赋值后调用、高阶函数传参执行等。

默认绑定发生在函数以最直接的方式被调用时——没有点号(.)、没有 new、没有 call/apply/bind,也没有箭头函数包裹。这时候的 this 指向,取决于当前是否处于严格模式。
非严格模式下指向全局对象
当脚本未启用严格模式(即没写 "use strict"),且函数是独立调用,例如:
foo()(foo)()(function(){})()-
setTimeout(foo, 100)中的回调(非箭头)
此时 this 会自动绑定到全局对象:浏览器中是 window,Node.js 中是 global。ES6 模块(.mjs 或含 import/export 的文件)除外,它们默认严格模式。
严格模式下 this 是 undefined
只要执行上下文启用了严格模式,包括:
- 顶部加了
"use strict" - 整个文件是 ES6 模块(如
index.mjs或含import的.js)
那么 foo() 这类调用中,this 就是 undefined,不会被“兜底”到全局对象。这是为避免静默错误而做的设计改进。
容易误判的典型情况
以下看似有上下文,实则仍是默认绑定:
-
var obj = { fn: function() { console.log(this); } }; var bar = obj.fn; bar();——bar是函数引用,调用无主体 function foo() { return this; } console.log(foo() === window); // 非严格模式下为 true- 高阶函数传参后独立执行:
setTimeout(obj.method, 100),回调里this不再是obj
如何验证当前 this 值
运行时快速确认:
-
console.log(this === globalThis);—— 非严格模式浏览器/Node.js 下为true -
console.log(this === undefined);—— 严格模式下为true
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











