JavaScript 中 this 指向的谜团:调用与赋值的区别?
this指向的疑虑与解答
对于this指向的问题,本文将围绕两个代码段展开讨论:
function foo() { console.log(this) } var obj = { a: 2, foo: foo } obj.foo()
var obj = { a: 2, foo: console.log(this) } obj.foo()
问题:
- 第一个代码段和第二个代码段是否等价?如果否,请解释原因。
- 这两个代码段中,this指向了什么?
解答:
-
第一个问题:两个代码段不等价。虽然看起来相似,但它们在执行时表现不同。
- 第一个代码段中,foo方法没有立即执行。obj.foo()语句调用该方法时,this指向obj对象。
- 第二个代码段中,foo直接被赋值给了obj.foo属性。这实际上将console.log(this)的执行结果(typeof this得到的window对象)赋值给了foo属性。
-
第二个问题:
- 第一个代码段:this指向obj对象,因为obj.foo()调用foo方法时,foo函数中的this指向调用者obj。
- 第二个代码段:this指向window对象,因为console.log(this)的执行结果是window对象,它被赋值给了foo属性。