对于闭包的理解,一直处于一种懵懂的状态,似是而非,模棱两可,令人很是头疼。以下是按照我的理解的学习笔记,如果有什么错处,请告知我~
一、闭包的定义
1、来自《javascript高级程序设计》中的定义:闭包是指有权访问另一个函数作用域中的变量的函数。
2、理解:首先,js的每个函数都有一个函数作用域,正常情况下,这个函数作用域中的变量和参数都是这个函数所有的,其他函数不能访问的到。但在闭包中,这个闭包可以访问另一个函数中的变量。
二、闭包的使用情景
(一)使用闭包代替全局变量
(二)在函数外部或其他函数中访问某一函数里面的变量
(三)在函数执行之前为要执行的函数提供具体参数
(四)在循环中避免局部变量泄漏为全局变量造成污染
三、闭包的代码
1、使用闭包代替全局变量
//正常情况下
var a = 1; //全局变量
function f1(){
alert(a);
}
f1(); //1
alert(a); //1
//我们有时候会定义一个全局变量,但是这个全局变量只在某一个范围内才使用到
//这种情况下可以使用闭包来代替全局变量
(function(){
var b = 2;
function f2(){
alert("f2:"+b);
}
function f3(){
alert("f3:"+b);
}
f2(); //f2:2;
f3(); //f3:2;
})();
alert(b); //在外面访问不到,undefined
2、在函数外部或其他函数中访问某一函数里面的变量
function f1(){
var a = 1;
temp = function(){ //temp没有用var声明,因此是全局变量
return a; //引用外部变量a,产生闭包
}
}
function f2(){
alert("f2:"+temp());
var test = temp();
alert("test:"+test);
}
f1(); //1
f2(); //f2:1 test:1
alert("window:"+temp()); //window:1
temp = null; //清除引用
3、在函数执行之前为要执行的函数提供具体参数
var a = 3;
function f1(){
alert("f1");
}
function f2(item){
alert("f2:"+item);
}
setTimeout(f1,500); //500ms后alert出f1
setTimeout(f2,500) //f2不传参,alert结果:f2:undefined
var test1 = f2(a); //执行一次f2,alert出f2:3
setTimeout(f2(a),500); //f2传入参数a,alert结果:f2:3
//以上两行代码,我们期待的结果是只发生一次alert,但实际上发生了两次
//解决方法是使用闭包,代码如下:
function f3(item){ //这个函数由f2改写
return function(){
alert("f3:"+item);
}
}
var test2 = f3(a); //返回f3内部函数的引用
setTimeout(test2,500); //alert结果:f3:3
4、在循环中避免局部变量泄漏为全局变量造成污染
for(var i = 0;i<5;i++){
setTimeout(function(){
console.log(i);
},0);
}
//5,5,5,5
//当执行setTimeout函数的时候,变量i已经循环结束
for(var i=0;i<5;i++){
return (function(i){
setTimeout(function(i){
console.log(i);
},0);
})(i);
}
//0,1,2,3,4