闭包个人理解:函数内部还有一个函数,其作用就是可以访问上一层函数中的变量
下面的案例中函数内部有函数,this的指向就变为window了
var name = "window" //这里是全局的
var obj = {
name:"obj",//这里是局部的
say:function(){ //这里是对象中的方法,这里的this指向obj这个对象
return function(){ //这里是闭包
return this.name //这里的this指向是window,所以结果是window
}
}
}
alert(obj.say())
改变闭包中this指向的两种方法:
1、call对象冒充可以改变this的指向
obj.say().call(obj) 这里把this的指向换成了obj
闭包中的this指向的是window对象,this.name=window.name
var name = "window" //这里是全局的
var obj = {
name:"obj",//这里是局部的
say:function(){ //这里是对象中的方法,这里的this指向obj这个对象
return function(){ //这里是闭包
return this.name //这里的this指向是window,所以结果是window
}
}
}
alert(obj.say().call(obj))
2、使用that暂存this
在方法内部改变this指向 既然对象中的say方法中this是指向obj的,那么我们就使用that代替this,在闭包函数中写成that.name 那么结果就是obj
var name = "window" //这里是全局的
var obj = {
name:"obj",//这里是局部的
say:function(){ //这里是对象中的方法,这里的this指向obj这个对象
let that = this
return function(){ //这里是闭包
return that.name //这里的this指向是window,所以结果是window
}
}
}
alert(obj.say())