javascript变量:局部变量和全局变量。
在javascript中,在函数内部可以直接读取全局变量,在函数外部无法读取函数内的局部变量。
<script type="text/javascript">
var MAX_LEN = 5;
function test(){
return MAX_LEN * 10;
}
alert(test()); // 50
</script>
需要注意的是,在函数内部的变量的定义一定要声明为var.否则默认为全局变量(当然你需要先执行这个函数)。
<script type="text/javascript">
function test(){
MAX_LEN = 10;
}
test();
alert(MAX_LEN); // 10
</script>
现在考虑要怎么才能在外部读取局部变量。
方式1:可以直接return该局部变量即可。
<script type="text/javascript">
function test(){
var maxLen = 10;
return maxLen;
}
var maxLen = test();
alert(maxLen);
</script>
方式2:可以提供一个对应的function,然后返回该function。
<script type="text/javascript">
function test(){
var pointX = 5,
pointY = 10;
function getX(){
return pointX;
}
return getX();
}
alert(test());
</script>
上面的这种还可以写成这种方法。
<script type="text/javascript">
function test(){
var pointX = 5,
pointY = 10;
function getX(){
return pointX;
}
return getX;
}
alert(test()());
</script>
如果要返回多个局部变量怎么处理,我们知道javascript中有:
<script type="text/javascript">
var Strong = {
version : '1.0.0',
author : 'xuzengqiang',
time : '2014-12-23'
};
alert(Strong.version);
</script>
所以对于上例中如果要同时返回pointX和pointY,可以写成:
<script type="text/javascript">
function test(){
var pointX = 5,
pointY = 10;
return {
x: pointX,
y: pointY
};
}
alert(test().x + '-' + test().y);
</script>
通过上面这些例子,我们可以浅显的认为:闭包就是可以访问函数局部变量的函数(当然它的功能并不局限于此),所以在方式二中所提供的getX()就可以看做成一个闭包。
闭包的用途:
1、可以在外部读取函数内部的局部变量。
2、可以使得这些局部变量被保存到内存中。
如何理解,且看:
<script type="text/javascript">
function test(){
var result = 100;
//相当于全局变量,不是局部变量,也称作匿名函数,匿名函数本身也是一个闭包,可以通过这种方式对局部变量进行操作。
add = function(){
result += 1;
}
function printResult(){
alert(result);
}
return printResult;
}
var res = test();
res(); //100
add();
res(); //101
</script>
调用res()实际上就是调用tes()函数中的printResult()闭包函数。第一次打印100.第二次打印101,说明了函数test中的result一直被保存在内存中,并没有在调用完test()之后立即被清除。
为什么:因为printResult()被作为返回值赋给了全局变量从而保存在内存中,而函数test()是pintResult的父函数,所以函数test()也被保存到内存中,从而不会在调用完成之后被垃圾回收机制回收。
注意:
1、由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大。所以不能滥用闭包,否则可能会带来性能问题,且IE下可能会导致内存溢出,解决方法:在调用完函数之后,删除多余不使用的局部变量。
2、闭包可以在父函数外部修改父函数局部变量的值,因此如果你把父函数当作对象使用,且闭包被当作公有方法,而局部变量是私有的情况下,尽量避免不要随意改动局部变量的值。