前面总结的很简单。需要有一定javascript的语法基础。如果有不对的地方,还请指正。
闭包
首先,我们先来聊一聊作用域 ,作用域,是一种环境,变量所处的环境,一个function(){} 会创建一个作用域,
<pre name="code" class="javascript">var a = 10;
function test(){
var a = 20;
return a;
}
var b = test(a);
alert(a);//10
alert(b);//20
上面的栗子中,全局变量 a 和 函数内变量 a 是两个不同的变量,输出的是两个不同的值
var a = 10;
function test(){
<span style="white-space:pre"> </span> a = 20;
return a;
}
var b = test(a);
alert(a);//20
<pre name="code" class="javascript">alert(b);//20
这个栗子却输出了20,前面说过,没有var关键字,会被赋值到window对象上,所以他们相当于两次赋值 ,那么问题来了,函数内的作用域是一个环境,怎么能用全局环境的值呢?
这里就要说一说延长作用域链,当一个变量在当前环境内没有找到声明时,会沿着作用域链访问活动对象,这是栗子中,window对象,就是test函数t的活动对象,变量a没有在函数内声明,他会访问活动对象,如果没有找到。返回undefined。
到了这里,我们就要说一说今天的猪脚。闭包。函数有自己的作用域,这个作用域,通过外部是访问不到的。栗子
var a = 10;
function test(){
var b = 20;
}
alert(a);//10
alert(b);//error
函数执行到alert(b)的时候。报错了,因为找不到变量b,作用域可以向上查找,但是不能反方向查找,这一点要牢记。
那么,我们如何访问变量b呢 :栗子
var a = 10;
function test(){
var b = 20;
return b;
}
alert(a);//
// alert(b);这里我们注释了
alert(test());
没错,就是return ,函数返回了变量b,当然,如果你alert(b),还是会报错,只不过,我们换了一个思路,调用函数,返回他的值。我们不需要变量名,而是他的值。
这就是闭包的一个简单的例子。 来个复杂的栗子
function test(){
var b = {num:20};
return {
getNum:function(){
return b.num;
},
setNum:function(num){
b.num = num;
},
}
}
alert(test().getNum());//20
test().setNum(30);
alert(test().getNum());//30
如果我们声明了一个对象,我不想别人直接操作他,而是给他两个方法,一个获得,一个设置。这样。我的对象就被保护起来。保证结构不被破坏,就像DOM和BOM提供的API一样。只是给了你一个调用的方法。这是一个闭包很好的作用。闭包,就说到这里,还有一些要点,被许多的大牛提到过,不再累述。如果有不对的地方,还请指正。