普通函数
* this总是指向函数的直接调用者
* 如果有new关键字,this指向new出来的实例对象
* 在事件中,this指向触发这个事件的对象
* IE下 attachEvent 中的this总是指向全局对象window
* 箭头函数中,函数体内的this对象,就是定义时所在作用域的对象,而不是使用时所在的作用域的对象
function foo () {
console.log(this.a)
}
var a = 1;
foo() // 1
const obj = {
a:2,
foo:foo
}
obj.foo() // 2
const c = new foo() //undefined
* 对于直接调用 foo来说,不管foo函数被放在了什么地方,this一定是window
* 对于obj.foo() 来说,只需要记住,谁调用了函数,谁就是this, 所以这里foo函数中的this 就是obj对象
* 对于 new 的方式来说,this被永远绑定在 new出来的对象上,不会被任何方式改变this
箭头函数
function a() {
return ()=>{
return ()=>{
console.log(this)
}
}
}
a()()() //window
* 箭头函数是没有this的,箭头函数中的this取决于包裹箭头函数的第一个普通函数的this
* 上述代码中,包裹箭头函数的第一个普通函数是 a,所以此时的 this 是window.
* 箭头函数使用bind这类函数是无效的