闭包:在一个函数外部能够访问函数内部变量的函数
闭包意义:避免全局空间的污染 (过多的定义全局变量会增加内存开销,影响协同开发)
弊端:内存泄露 :一块内存空间既不能被使用了,也不能被回收
首先 先看一下闭包的案例
//js特性 闭包:在一个函数外部能够访问函数内部变量的函数
function foo(){
var a = 10;//闭包变量
function bar(){ //闭包函数
console.log(a++);
}
return bar;
}
//foo();
//在foo的外部去执行bar
var baz = foo();
baz();//10
baz();//11
闭包的意义
//避免全局空间的污染 (过多的定义全局变量会增加内存开销,影响协同开发)
var obj = (function(){
var a = 10;
/*return function(){
console.log(a);
}*/
function foo(){
console.log(a);
}
function bar(){
}
function baz(){
}
return {
foo:foo,
bar:bar,
baz:baz
}
})();
obj.foo();//10
obj.bar();
obj.baz();
闭包经典例子(点击li获得li对应索引)
var aLi = document.getElementsByTagName("li");
for(var i = 0; i < aLi.length; i++){
//1 建议使用
(function(i){
aLi[i].onclick = function(){
console.log(i+"内容是"+aLi[i].innerHTML);
}
})(i);
//2
aLi[i].onclick = (function(i){
return function(){
console.log(i);
}
})(i);
//3
aLi[i].index = i; //给每个li定义一个属性索引值,赋
aLi[i].onclick = function(){
console.log("下标索引值为:"+this.index+"\n"+"文本内容是:"+this.innerHTML);
// \n换行 索引值从0开始
}
}
Jquery实现
//jQuery实现
$("ul li").click(function(){
var item = $(this).index(); //获取索引下标 也从0开始
var textword = $(this).text(); //文本内容
alert("下标索引值为:" + item +"\n"+ "文本内容是:"+textword); // \n换行
})
闭包引发的内存泄露问题及解决方案
大量使用闭包导致内存泄露 一块内存空间既不能呗使用 也不能被回收
null
ok 就这么多啦。。。。