关于js的闭包问题这里先用示例作初步说明,后续有深入理解再进行补充
var name = "xiao A"
var obj = {
name:"xiao B",
getName:function(){
return function(){
return this.name;
}
}
}
alert(obj.getName()()) // xiao A
首先,obj.getName返回
function(){
return function(){
return this.name
}
}
obj.getName()执行了这个函数,返回的是
function(){
return this.name
}
obj.getName()()则执行这个函数,返回this.name。这时,obj.getName()这个函数的运行环境是全局,也就是window,所以this指的就是window,this.name就是xiao A
将代码做如下修改:
var name = "xiao A"
var obj = {
name:"xiao B",
getName:function(){
var o = this;
return function(){
return o.name;
}
}
}
alert(obj.getName()()) // xiao B
上述修改的作用是在执行obj.getName这个方法时将调用者obj临时保存在变量o中,后面o.name实际上返回的就是obj.name了
(利用call()扩充作用域 alert(obj.getName().call(obj))也可以返回xiao B )
对闭包作简要描述:
1.闭包:一个函数可以访问另一个函数作用域中的变量
2.封闭性:private 起到一个保护变量的作用
当一个函数在创建它的环境外部调用时,这个函数就是一个闭包。闭包会记住创建它的环境。