闭包的应用场景有哪些?
Javascript 583
了解下闭包的应用场景,一起看下吧。
//场景1:保存现场。如果不进行捕获则不会正确弹出li节点对应的文本值
var li = document.getElementsByTagName("li");
for(var i=0;i<li.length;i++){
li[i].onclick=(function (i) {
return function () {
alert(li[i].firstChild.nodeValue);
}
})(i);
}
//场景2:封装。保证外部直接访问不到变量num但可以通过 setNum和getNum方法类似于java里的私有变量。
(function () {
var num =0;
function getN() {
return num ;
}
function setN(x) {
num=x;
}
window.getNum=getN;
window.setNum=setN;
})();
alert(getNum());
setNum(12);
alert(getNum());
// 场景3:减少全局变量 如果不使用闭包使a自增则需要将a变量放到外部
function foo2() {
var a = 0;
return function foo3() {
a++;
alert(a);
}
}
var foo4 = foo2();
foo4();
foo4();
// 场景4:性能优化:减少函数定义时间和内存消耗
// 如果add函数越复杂则减少的时间就越多
var sum = (function() {
var add = function(i, j){
return i+j;
}
return function(i,j) {
add(i, j);
}
})()
var startTime = new Date();
for(var i = 0; i< 1000000; i++) {
sum(1,1);
}
var endTime = new Date();
console.log(endTime - startTime);