闭包

对于闭包的理解,一直处于一种懵懂的状态,似是而非,模棱两可,令人很是头疼。以下是按照我的理解的学习笔记,如果有什么错处,请告知我~

一、闭包的定义

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
参考文档:http://www.cnblogs.com/star-studio/archive/2011/06/22/2086493.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值