JS基础——this

107 阅读1分钟

this的指向

this的指向与函数声明的位置没有关系,只与函数调用的位置有关。

this的绑定规则

  • 默认绑定
  • 隐式绑定
  • 显式绑定
  • new绑定

默认绑定

function func() {
  console.log(this.a)
}

var a = 1
func() // 1

func函数是全局调用的,所以func中的this指向的是全局对象。 func是直接调用的,未带任何修饰调用的,因此只能使用默认绑定。

备注: 如果使用严格模式(strict mode),全局对象就无法默认绑定,this就会绑定到undefined上。

隐式绑定

需要考虑的规则是调用位置是否有上下文对象,或者说是否被某个对象拥有或者包含

function foo() {
  console.log( this.a );
}
 
var obj = {
  a: 2,
  foo: foo
};
 
obj.foo(); // 2

对象属性链中只有最顶层或最后一层影响调用位置

function foo() {
  console.log( this.a );
}
 
var obj2 = {
  a: 42,
  foo: foo
};
 
var obj1 = {
  a: 2,
  obj2: obj2
};
 
obj1.obj2.foo(); // 42

显式绑定

通过call、bind、apply进行显式绑定

new绑定

function foo(a) {
  this.a = a;
}
 
var bar = new foo(2);
console.log( bar.a ); // 2

通过new调用foo()的时候,会创建一个新的对象,foo中this就会指向这个新创建的对象。

绑定优先级

new绑定 > 显式绑定 > 隐式绑定 > 默认绑定