普通函数的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 指向该对象:
- 只看“点号左边是谁”,不是看函数在哪定义的;
- 即使函数从别处赋值过来,只要调用时带点,就绑定点左边的对象。
例如:
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 指向 pJava免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











