这么专业的术语,真是不懂,没事,有我在!!!
名词解释:
- JS垃圾回收机制:找出不再使用的变量,释放其占用的内存。
- 变量生命周期:全局变量直至浏览器卸载页面才会结束;局部变量,函数执行结束才会结束。
- 全局变量污染:上面我定义一个aa的函数 ,比人也定义一个aa的函数,那么我的aa的函数就会被覆盖掉。
一、JS中的垃圾回收机制
1.举个例子:
function aa(){
var a=1;
}
aa();
- 解析:a为局部变量,当函数结束后,该变量就会被释放,不存在。
- 变量生命周期:全局变量直至浏览器卸载页面才会结束;局部变量,函数执行结束才会结束。
二、全局变量污染
1.举个例子:
var a=1;
function aa(){
a++;
alert(a);
}
aa(); //2
aa(); //3
function aa(){
a--;
alert(a);
}
aa();
aa();
- 解析:全局变量污染就是同名函数覆盖掉之前定义的函数。
- 所以运行结果就是函数被调用四次,结果为0,-1,-2,-3。
- 要避免使用全局变量。
三、什么是闭包?
1.必备条件:
- 函数嵌套函数。
- 内部函数可以引用外部函数的参数或者变量。
- 参数和变量不会被垃圾回收机制收回。
2.闭包的形式一:
function aa(a){
var b=5;
function bb(){
alert(a); //50
alert(b); //5
}
bb();
}
aa(50);
3.闭包的形式二:
function aa(a){
var b=5;//变量没有被收回
function bb(){
alert(a); //5
}
return bb;
}
var c=aa();
c();
四、闭包的好处?
- 希望一个变量长期驻扎在内存中
- 避免全局变量的污染
- 私有成员的存在
1.使用局部变量对函数结果进行累加:
- 出现问题:两次运行结果一样
function aa(){
var a=1;
a++;
alert(a);
}
aa(); //2
aa(); //2
- 解决方案:闭包
function aa(){
var a=1;
return function(){
a++;
alert(a);
}
}
var b=aa();
b();//2
b();//3
alert(a);//
五、函数表达式与代码模块化模型
参考一:
function aa(){
alert(1);
}
aa();
改写参考一:
(function (){
alert(1);
})()
//这就变成了函数表达式,后面可以直接调用。
//可以不用函数名字,以为调用的就是函数。
参考二:(模块化代码)
var aaa=(function(){
var a=1;
function bbb(){
a++;
alert(a);
}
function ccc(){
a++;
a++;
alert(a);
}
return{
g:bbb,
o:ccc
}
})();
aaa.g();//2
aaa.o();//3
//return把两个函数的返回值给扔出去,面向对象的写法。
六、利用闭包在循环内部找到索引值
- (html部分):
<ul>
<li>晗</li>
<li>晗</li>
<li>宝</li>
<li>宝</li>
</ul>
- (js部分写法一):
window.onload=function(){
var ali=document.getElementsByTagName('li');
for (var i = 0; i < ali.length; i++) {
(function(i){
ali[i].onclick=function(){
alert(i);
}
})(i);
}
- (js部分写法二):
window.onload=function(){
var ali=document.getElementsByTagName('li');
for (var i = 0; i < ali.length; i++) {
ali[i].onclick=(function(){
return function(){
alert(i);
}
})(i);
}
}