JavaScript中this指向函数被调用时的执行上下文对象,非定义时决定:普通调用下严格模式为undefined、非严格模式为全局对象;对象方法调用时指向调用者对象;call/apply/bind可显式绑定;箭头函数无this,继承外层词法作用域;new调用时指向新创建实例。
JavaScript中的this指向**函数被调用时的执行上下文对象**,不是定义时决定的,而是运行时动态绑定的——这正是它“动态性”的核心。
直接调用函数(如 foo()),不通过任何对象或关键字触发时,this 的绑定完全取决于是否启用严格模式:
this 指向全局对象(浏览器中是 window,Node.js 中是 global)this 为 undefined,避免意外污染全局示例:
function say() { console.log(this); }当函数作为对象的属性被调用(即 obj.method()),this 指向点号前的那个对象(即 obj):
注意:一旦把方法单独提取出来,就失去对象绑定,变成普通调用,this 会失效:
这三个方法允许你手动传入一个对象,让函数内部的 this 指向它:
func.call(obj, arg1, arg2) —— 立即执行,参数逐个传func.apply(obj, [arg1, arg2]) —— 立即执行,参数以数组形式传const bound = func.bind(obj) —— 返回新函数,永久绑定 this 为 obj
这是解决“方法提取后 this 丢失”最常用的方式,比如事件回调或定时器中:
setTimeout(user.greet.bind(user), 100); // 正确输出 Hello, Alice箭头函数不创建自己的执行上下文,它的 this 是词法继承的——定义时所在函数作用域的 this 值,之后永远不会变:
但如果在普通函数内定义箭头函数,它就能“捕获”那个函数的 this:
用 new 调用函数时,JS 引擎会自动创建空对象,并将 this 绑定到该对象上,最后返回它(除非显式返回其他对象):