JavaScript中this关键字的方法绑定与作用域指向疑问
JavaScript普通函数
this指向规则及案例拆解 普通函数的this指向由「调用时的上下文」决定,和函数定义位置无关,遵循「谁调用指向谁」的原则,无明确调用主体时非严格模式下默认指向全局对象(浏览器环境为window,Node环境为globalThis)。
案例逐个解析
符合预期的三个调用
obj1.objlog1():objlog1作为obj1的方法被调用,this指向obj1,输出obj1 scopeobj1.objlog2():这是ES6标准的对象方法简写写法,本质和objlog1的普通函数定义完全一致,this指向obj1,输出obj1 scopeobj1.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
相关产品推荐
相关产品推荐

