普通函数中this的默认指向取决于调用方式而非定义位置;独立调用时,非严格模式下指向全局对象,严格模式下为undefined,且仅在其他绑定规则均不生效时启用。

普通函数中 this 的默认指向,关键看它“怎么被调用”,而不是“写在哪”。只要函数是独立调用(没用点号、没用 new、没用 call/apply/bind),就走默认绑定规则。
默认绑定:独立调用时的 this 指向
所谓“独立调用”,就是函数名后面直接跟括号,前面没有任何对象或操作符。比如 fn()、myFunc(),甚至 (function(){})() —— 只要没依附于某个对象,就属于默认绑定。
- 非严格模式下:
this指向全局对象(浏览器中是window,Node.js 中是globalThis或global) - 严格模式下:
this是undefined,不会自动挂到全局,避免意外污染
常见容易误判的独立调用场景
很多 bug 出在看似有上下文,实则已丢失隐式绑定的地方:
- 把对象方法赋值给变量后再调用:
const f = obj.method; f();→ 此时f已脱离obj,变成独立调用 - 作为回调传入高阶函数:
setTimeout(obj.fn, 100)或arr.map(obj.method)→ 回调内部的this不再是obj - 嵌套函数内部调用:
obj.method里定义并立即执行的内层函数,this与外层无关,仍按自身调用方式判断
如何验证当前 this 是否符合默认绑定
最直接的办法是在函数里打印 this,并观察运行环境和模式:
立即学习“Java免费学习笔记(深入)”;
- 在浏览器控制台直接运行
function test() { console.log(this); } test();→ 输出window(非严格)或undefined(严格) - 加
"use strict"后再试,结果会明显不同,这是区分模式的关键信号 - 注意模块环境(如 ES Module 或 CommonJS):顶层
this在 Node.js 中不是global,而是module.exports,但普通函数内部仍遵循默认绑定规则
默认绑定是优先级最低的规则
它只在其他四条规则(new、显式绑定、隐式绑定、箭头函数继承)都不生效时才起作用。一旦函数被 call、bind 或作为 obj.fn() 调用,就不再走默认绑定。


















