1. this

原理:this永远指向最后一个调用它的那个对象

  1. 情景一 普通函数调用,this指向window
function fn(){
  console.log(this); 
}
fn()  //Window
1
2
3
4
  1. 情景二 作为对象方法的调用 this指向该方法所属的对象
var obj = {
  fn:function(){
    console.log(this) // obj
  }
}
obj.fn()
1
2
3
4
5
6
  1. 情景三 作为构造函数调用 this指向实例对象
function test() {
 this.x = 1;
}

var obj = new test();
obj.x // 1
1
2
3
4
5
6
  1. 情景四 事件绑定的方法 this指向绑定事件的对象
btn.onclick = function(){
  console.log(this)
}
1
2
3
  1. 情景五 定时器函数 this指向window
setInterval(function(){
  console.log(this);// window
},1000);
1
2
3

函数内部的 this 是由调用时确定其指向,匿名函数的this指向window

2. bind,call,apply

使用 apply、call、bind 函数是可以改变 this 的指向的

bind

bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。

语法

function.bind(thisArg[,arg1[,arg2[, ...]]])

var a = {
  name : "Cherry",
  func1: function () {
    console.log(this.name)
  },
  func2: function () {
    setTimeout(  function () {
      this.func1()
    }.bind(a)(),100);
  }
};
a.func2()            // Cherry
1
2
3
4
5
6
7
8
9
10
11
12

call

将函数作为对象的方法来调用,将指定参数传递给该方法

语法

function.call(thisObj, arg1,arg2,...argN)

var a = {
  name : "Cherry",
  func1: function () {
    console.log(this.name)
  },
  func2: function () {
    setTimeout(  function () {
        this.func1()
    }.call(a),100);
  }
};
a.func2()            // Cherry
1
2
3
4
5
6
7
8
9
10
11
12

apply

将函数作为对象的方法来调用,将参数以数组形式传递给该方法

语法

function.apply(thisObj,[arg1,arg2,....argN])

var a = {
  name : "Cherry",
  func1: function () {
    console.log(this.name)
  },
  func2: function () {
    setTimeout(  function () {
        this.func1()
    }.apply(a),100);
  }
};
a.func2()            // Cherry
1
2
3
4
5
6
7
8
9
10
11
12

3. 箭头函数

箭头函数的 this 始终指向函数定义时的 this,而非执行时。

箭头函数中没有 this 绑定,必须通过查找作用域链来决定其值,如果箭头函数被非箭头函数包含,则 this 绑定的是最近一层非箭头函数的 this,否则,this 为 undefined

  var name = "windowsName";
  var a = {
    name : "Cherry",
    func1: function () {
      console.log(this.name)     
    },
    func2: function () {
      setTimeout( () => {
        this.func1()
      },100);
    }
  };
  a.func2()     // Cherry
1
2
3
4
5
6
7
8
9
10
11
12
13

在函数内部使用 _this = this

先将调用这个函数的对象保存在变量 _this 中,然后在函数中都使用这个 _this,这样 _this 就不会改变了。

var name = "windowsName";
var a = {
  name : "Cherry",
  func1: function () {
    console.log(this.name)     
  },
  func2: function () {
    var _this = this;
    setTimeout( function() {
      _this.func1()
    },100);
  }
};
a.func2()       // Cherry
1
2
3
4
5
6
7
8
9
10
11
12
13
14