一、this总是指向一个对象,具体指向哪个对象是在运行时基于函数的执行环境动态绑定的,不是函数声明时候的环境。(非箭头函数的this)

二、当函数作为对象的方法调用时,函数里面的this指向该对象。例如:

let obj = {

  name: 'zhang san',

  getName: function () {

    return this.name

  },

  isObj: function () {

    return this === obj

  }

}

console.log(obj.getName())  // zhang san

console.log(obj.isObj())  //  true

三、当函数不作为对象的方法调用,只作为普通函数调用时,函数里面的this指向全局对象,在浏览器中,全局对象是window。(非严格模式下)。例如:

window.name = 'global zhang san'

定义第二点的那个对象obj。

let getName = obj.getName

console.log(getName()) // global zhang san

 

let getName2 = function () {

  return this.name

}

console.log(getName2()) // global zhang san

 

function getName3 () {

  return this.name

}

console.log(getName3()) // global zhang san

四、当函数作为构造器调用时,函数里面的this指向,通过new 函数返回来的对象。假如这个函数显示的返回了一个object类型的对象,那么new 函数的结果就是这个对象,即this指向这个对象。例如:

let Person = function () {

  this.name = 'li si'

}

let p = new Person()

console.log(p.name) // li si

 

let Person2 = function () {

  this.name = 'li si'

  return {

    name: 'new li si'

  }

}

let p2 = new Person2()

console.log(p2.name) // new li si

 

let Person3 = function () {

  this.name = 'li si'

  return 'aaa'

}

let p3 = new Person3()

console.log(p3.name) // li si

五、call、apply、bind可以动态的改变函数的this的指向。具体看之前写的随笔