闭包的优点及使用闭包的注意点
一. 闭包的优点:
1) 减少全局变量
<script>
function f(){
var a = 0;
return function () {
a++;
alert(a);
}
}
var result = f();
result(); //1
result(); //2
</script>
2) 减少传递给函数的参数数量
<script>
function calFactory(base){
return function (max) {
var total = 0;
for(var i = 1; i <= max; i++){
total += i;
}
return total + base;
}
}
var adder = calFactory(2);
alert(adder(3)); //8
</script>
3) 封装
<script> (function () { var m = 0; function getM(){ return m; } function setM(val){ m = val; } window.g = getM; window.f = setM; })(); f(12); alert(g()); //12 </script>
二. 使用闭包的注意点:
1) 对捕获的变量只引用不是赋值
<script>
function f(){
var num = 1;
function g(){//g scope
alert(num);
}
num++;
g();
}
f(); //f LE
</script>
2) 父函数每调用一次会产生不同的闭包
<script>
function f(){
var num = 1;
return function () {
num++;
alert(num)
}
}
var result1 = f(); //LE1
result1(); //2
result1(); //3
var result2 = f(); //LE2,每调用一次会产生一个新的词法环境
result2(); //2
result2(); //3
</script>
3) 循环
<body>
<div id = "1">1</div>
<div id = "2">2</div>
<div id = "3">3</div>
<script>
// for(var i = 1; i <= 3; i++){
// var ele = document.getElementById(i);
// ele.onclick = function () {
// alert(i); //4 4 4
// }
// }
for(var i = 1; i <= 3; i++){
var ele = document.getElementById(i);
ele.onclick = (function (id) {
return function (){
alert(id); //1 2 3
}
})(i);
}
</script>
</body>

浙公网安备 33010602011771号