一、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的指向。具体看之前写的随笔