this是函数执行的主体(谁执行的)
this是谁和函数是在哪儿创建的或者在哪儿执行的都没有必然的联系。
判断this
- 给元素的某个事件绑定方法,当事件触发方法执行的时候,方法中的this是当前操作的元素。
- 方法执行,看方法前面是否有点,有点,点前面是谁,this就是谁,没有点this就是window(在严格模式下没有点this是undefined),所有自执行函数的this一般都是window
- 在构造函数模式执行中,函数体中的this是当前类的实例
var num = 10
var obj = { //开辟一个堆 AF0
num: 20
}
obj.fn = (function (num) { //自执行函数AF1中,形参赋值 num = 20
this.num = num * 3 //这里的this是window, 所有修改全局num = 20*3 = 60
num++ //自执行函数AF1中 num = 21
return function (n) { //返回一个匿名函数,地址值假设为BF0
this.num += n
num++ //这里num的上级作用域是AF1
console.log(num)
}
})(obj.num) //这里是一个自执行函数AF1,形成num = 20
var fn = obj.fn //fn = BF0
fn(5) //22 说明: 这里BF0的形参n = 5, 且BF0中的this为window,所以执行完BF0后,全局的num = 65,AF1中的num = 22
obj.fn(10) //23 说明: 这里BF0的形参n = 10,且BF0中的this为obj,所以执行完BF0后,obj(AF0)中的num = 30,AF1中的num = 23
console.log(num, obj.num) //65, 30