You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中this关键字的方法绑定与作用域指向疑问

JavaScript普通函数this指向规则及案例拆解

普通函数的this指向由「调用时的上下文」决定,和函数定义位置无关,遵循「谁调用指向谁」的原则,无明确调用主体时非严格模式下默认指向全局对象(浏览器环境为window,Node环境为globalThis)。

案例逐个解析

符合预期的三个调用

  • obj1.objlog1():objlog1作为obj1的方法被调用,this指向obj1,输出obj1 scope
  • obj1.objlog2():这是ES6标准的对象方法简写写法,本质和objlog1的普通函数定义完全一致,this指向obj1,输出obj1 scope
  • obj1.objlog3():log函数被赋值给obj1的objlog3属性后,作为obj1的方法被调用,this指向obj1,输出obj1 scope

obj1.objlog4()输出global scope的原因

objlog4内部是直接裸调用log():
虽然调用obj1.objlog4()时,objlog4本身的this确实是obj1,但内部执行log()时没有任何调用主体,属于独立调用,此时log的this默认指向全局对象,因此输出全局的name值global scope。

它和objlog3的核心差异是调用上下文不同:objlog3是obj1主动调用log,objlog4内部的log是无所属对象的独立调用,二者的this绑定规则不互通。

objlog5未主动调用就自动执行的原因

定义objlog5时的写法是objlog5: log(),这里的()会触发log函数立即执行,执行后的返回值会被赋值给objlog5:
在obj1对象初始化的阶段,这行代码就会直接运行log(),此时同样是无主体的裸调用,this指向全局,输出global scope。由于log函数没有return语句,最终obj1.objlog5的值为undefined,后续访问obj1.objlog5只是读取这个属性值,不会再次触发函数执行。

普通函数this快速判断技巧

  • 调用函数时如果有xxx.前缀,this就指向前缀对应的xxx对象
  • 没有任何前缀的裸调用,this默认指向全局(非严格模式)
  • 赋值语句中出现函数名()的写法,代表立即执行函数取返回值,不是存储函数引用

内容的提问来源于stack exchange,提问作者Aiden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:42:03