Open AwakenedSomeone opened 3 years ago
接上一次this(1)
上次说到了this作用域的绑定规则之一:默认绑定到全局作用域,这次说一下第二个方式:隐式绑定。 隐式绑定要考虑调用位置是否有上下文对象,或者说是否被某个对象拥有或包含。举个栗子:
function foo () { console.log(this.a) } var obj = { a: 2, foo: foo } obj.foo() // 2
这里foo被调用的时候,是通过对象obj去调用的,调用位置会使用obj上下文来引用函数,此时可以称函数foo被调用时obj对象“拥有”或者“包含”foo函数的引用。
当函数引用有上下文对象的时候,隐式绑定规则会把函数调用中的this绑定到这个上下文对象。因为调用foo时this被绑定到obj,此时this.a和obj.a是一样的。 需要注意的一点:对象属性引用链中只有上一层或者说最后一层在调用位置中起作用。如下所示:
function foo () { console.log(this.a) } var obj2 = { a: 42, foo: foo } var obj1 = { a: 2, obj2: obj2 } obj1.obj2.foo() // 42
由这个例子可以看出,this被绑定到了obj2上下文对象上,而没有再绑定到obj1上了。
function foo () { console.log(this.a) } var obj = { a: 4, foo: foo } var bar = obj.foo // 函数别名 var a = "oops, global" bar() // "oops global"
由于赋值操作,调用bar的时候,其实调用的是foo本身,因为bar引用的就是foo本身,此时则是不带任何对象修饰的调用。则this使用了默认绑定。 除了上述方式,还有一种将函数当做参数的方式传入回调函数。
function foo () { console.log(this.a) } function doFoo(fn) { fn() // fn其实引用的是foo } var obj = { a: 2, foo: foo } var a = 'global' doFoo(obj.foo) // global
因为传惨是一种隐式赋值,所以传入函数时也会被隐式赋值,则此时的情况就跟上一个例子一样,执行doFoo的时候this绑定到全局作用域了。
接上一次this(1)
上次说到了this作用域的绑定规则之一:默认绑定到全局作用域,这次说一下第二个方式:隐式绑定。 隐式绑定要考虑调用位置是否有上下文对象,或者说是否被某个对象拥有或包含。举个栗子:
当函数引用有上下文对象的时候,隐式绑定规则会把函数调用中的this绑定到这个上下文对象。因为调用foo时this被绑定到obj,此时this.a和obj.a是一样的。 需要注意的一点:对象属性引用链中只有上一层或者说最后一层在调用位置中起作用。如下所示:
由于赋值操作,调用bar的时候,其实调用的是foo本身,因为bar引用的就是foo本身,此时则是不带任何对象修饰的调用。则this使用了默认绑定。 除了上述方式,还有一种将函数当做参数的方式传入回调函数。
因为传惨是一种隐式赋值,所以传入函数时也会被隐式赋值,则此时的情况就跟上一个例子一样,执行doFoo的时候this绑定到全局作用域了。