我已经阅读了有关this关键字的这一段:https://bonsaiden.github.io/JavaScript-Garden/#function.this
在第一种情况下,this
指向global
对象,这似乎是很正常的,因为当我们拥有箭头功能时,它会自动将this
与外部作用域绑定。
var obj = {
foo : () => console.log(this)
}
console.log(obj);
obj.foo()
但是,我无法解释以下行为:
function bar(){
this.foo = () => console.log(this)
}
var obj = new bar()
console.log(obj);
obj.foo()
现在,this
是指obj
而不是global
。这是为什么 ?在我看来,将new
关键字与构造函数一起使用应该返回一个对象obj
,该对象与第一个示例中的对象完全相同。因此,箭头函数应该有一个this
,它指向global
,而不是obj
。请问第二种情况是怎么回事?
答案 0 :(得分:4)
->
No separate this
在箭头函数之前,每个新函数都定义了自己的this值(对于构造函数而言,是 新对象 ,在{{3}中未定义) }函数调用,如果该函数被称为“对象方法”等,则为基础对象)。事实证明,采用面向对象的编程风格并不理想
使用指定的参数调用构造函数...,并将
this
绑定到 新创建的对象 。
bar()构造函数将this
定义为自身。
答案 1 :(得分:0)
尽管我本人对对象(需要进行处理)远非如此,但我认为当您const test = new Test()
进行操作时,您会初始化一个新对象。这样,this
的scope(?)仅引用了新创建的对象,因此为什么要这样做this.foo
,以后又要使用obj.foo
来引用该foo属性。另一方面,当您只执行const obj = { .... }
时,实际上并没有初始化新对象,因此this
会直接转到全局对象-窗口。因此,const test = new Test
创建一个 new 对象,而仅使用const obj = {}
并不是 一个新对象,并且this
默认转到窗口对象。