this绑定的时机
- this是在运行时候绑定的,并不是在编写的时候,它的上下文取决于函数调用时候的各种条件。this的绑定和函数声明的位置没有任何关系,只取决于函数调用的位置。
this的绑定规则
-
默认绑定
独立的函数调用,可以把这条规则看做是无法应用其他规则的默认规则。function foo(){ console.log(this.a) } var a = 2; foo() //2 // 这里的foo()函数是直接不带任何修饰的函数调用,因此只能使用默认绑定
-
隐式绑定
函数调用位置是否有上下文对象,或者说是否被某个对象包含。function foo() { console.log(this.a) } var obj = { a: 2, foo:foo } obj.foo() // 2 // 这里的隐私绑定会把函数调用中的this绑定到这个上下文对象。
2.1 隐式丢失
一个常见的问题是隐式绑定的函数会丢失绑定对象,也就是说会默认应用默认绑定,这时候的this
可能会被绑定到全局上或者是undefined
function foo() { console.log(this.a) } var obj = { a: 2, foo:foo } var bar = obj.foo(); var a = 'global'; bar() // global
这里的bar函数引用了
obj.foo
,但实际上引用的是foo函数本身,因此此时的bar
函数其实是一个不带任何修饰的函数调用,因此应用了默认绑定。
参数传递也是一种隐式赋值。传入的回调函数中一般也是隐式丢失,应用默认绑定。 -
显式绑定
使用bind
apply
call
等方法签字改变this
指向,我们称为显示绑定function foo() { console.log(this.a) } var obj = { a: 2 } foo.call(obj) //2