闭包的作用域问题
通过闭包来延长某个作用域的范围
function foo(){
var a=10;
var baz = function(){
a*=2;
return a;
};
return baz;
};
var ba = foo();
ba();//-->20
ba();//-->40
var b= ba();
alert(b);//-->80
a这个变量是保存在 baz这个作用域中
通过闭包调用所有函数,会先在自己的作用域中找,然后依次去上一级中查找
第二次调用时,a的值已经是20
闭包的this问题
var name = "window";
var person = {
name:"zhangsan",
age:23,
say:function(){
return function(){
return this.name;
}
}
}
alert(person.say());//得到函数
alert(person.say()());//得到值 window
当完成person.say()之后,这个函数就调用结束了,在这个函数调用结束之前
this是指向person,但是在调用匿名函数的时候,this就指向window,所以得到的结果是window
var name = "window";
var person = {
name:"zhangsan",
age:23,
say:function(){
var that = this;
return function(){
return that.name;
}
}
}
alert(person.say());//得到函数
alert(person.say()());//得到值 zhangsan
闭包的块作用域
for(var i=0;i<10;i++){
}
alert(i);//10
在js中没有块作用域,不管是使用循环还是判断,这个变量会一直存在
当在全局使用某个变量进行循环或者判断之后,这个变量会影响到函数的变量,所以特殊情况不要使用全局变量,而且使用全局变量
在作用于链中是最慢的,解决的方式是闭包
(function(){
for(var i=0;i<10;i++){
}
})();
function fn(){
alert(i);
}
fn(); //找不到 i
i 在 (function(){})(); 内部 ,当函数执行完,函数也随之消失
函数的私有变量
function person(name){
//此时就没有办法直接访问name这个属性,因为没有this.name
//要访问name只能通过this.getName,this.setName
this.setName = function(){
name = value;
}
this.getName = function() {
return name;
}
}
var p = new Person("aa");
alert(p.name);//没定义
p.setName("aa");
alert(p.getName);//aa
如此方式带来的问题就是每个函数都会存储大量的函数
解决的办法就是静态似有变量来解决
var Person;
(function(){
//name在函数结束就消失
var name = "";
Person = function(value){
name = value;
}
Person.prototype.setName = function(value){
name =value;
}
Person.prototype.getName = function(){
return name;
}
})();
var p1 = new Person("aa");
alert(p1.getName);//aa
p1.setName("bb");
alert(p1.getName);//bb