this
是在运行中绑定的,并不是在编写时绑定。它的上下文取决于函数调用时的各种条件。this
的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。this
就是这样一个属性,它指向什么完全取决于在哪里被调用。foo()
的调用形式被称为Function Invocation Pattern,是函数最直接的使用形式,注意这里的foo是作为单独的变量出现,而不是属性。foo.bar()
的调用形式被称为Method Invocation Pattern,注意其特点是被调用的函数作为一个对象的属性出现,必然会有“.”或者“[]”这样的关键符号。在这种模式下,bar函数体中的this永远为“.”或“[”前的那个对象,如上例中就一定是foo对象。new foo()
这种形式的调用被称为Constructor Pattern,其关键字new
就很能说明问题,非常容易识别。 在这种模式下,foo函数内部的this永远是new foo()返回的对象。foo.call(thisObject)
和foo.apply(thisObject)
的形式被称为Apply Pattern,使用了内置的call
和apply
函数。在这种模式下,call
和apply
的第一个参数就是foo函数体内的this,如果thisObject是null
或undefined
,那么会变成Global对象。this
foo()
内部创建的箭头函数会捕获调用时foo()
的this
。由于foo()
的this
绑定到obj1
,bar
的this
也会绑定到obj1
,箭头函数的绑定无法被修改(new
也不行)