普通函数的this取决于调用方式:直接调用时非严格模式指向全局对象、严格模式为undefined;作为对象方法调用时指向点号左侧对象;call/apply/bind可显式绑定this;new调用时this指向新实例。

普通函数中的 this 值,完全取决于**函数被调用时的上下文(调用方式)**,而不是定义位置或词法作用域。它和箭头函数不同,没有“继承外层 this”的行为。
直接调用(独立调用)
当函数不通过任何对象、也不用 new 或 call/apply/bind 调用时,属于直接调用:
- 在非严格模式下,this 指向全局对象(浏览器中是 window,Node.js 中是 global);
- 在严格模式下,this 是 undefined。
例如:
function foo() { console.log(this); }
foo(); // 非严格模式 → window;严格模式 → undefined
作为对象方法调用
当函数被某个对象“拥有”并以 obj.method() 形式调用时,this 指向该对象:
立即学习“Java免费学习笔记(深入)”;
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 只看“点号左边是谁”,不是看函数在哪定义的;
- 即使函数从别处赋值过来,只要调用时带点,就绑定点左边的对象。
例如:
const obj = { name: 'Alice', say: function() { console.log(this.name); } };
obj.say(); // 'Alice' —— this 指向 obj
通过 call / apply / bind 显式绑定
这些方法可以强制指定函数执行时的 this 值:
- func.call(obj, arg1, arg2):立即执行,this 设为 obj;
- func.apply(obj, [args]):同上,参数以数组传入;
- func.bind(obj):返回一个新函数,之后无论怎么调用,this 都固定为 obj(硬绑定)。
构造函数调用(new)
用 new 调用函数时,会创建新对象,并把 this 绑定到这个新实例上:
- 函数内部的 this 指向新生成的实例;
- 如果函数显式返回一个对象,则返回该对象;否则返回新实例。
例如:
function Person(name) { this.name = name; }
const p = new Person('Bob');
console.log(p.name); // 'Bob' —— this 指向 p

















