JavaScript基础 闭包

回收机制

一个变量或函数执行完后,下面的代码没有在使用或调用时会被回收回去,释放出内存。定义一个变量、函数会在内存占一定的空间;(全局变量、函数不会被回收)

了解函数调用

 
一、 

fn();
function fn(){
    var a = 10;
    alert( a );  ===>a没有再被引用,会被回收
}                    (在下面的代码毫无作用的时候)

二、
fn();
function fn(){
    var oBox = document.getElementById( 'box' );
    oBox.onclick = function (){
        var a = oBox.id;  这里的oBox 不会被回收
    }                    
}

oBox是事件函数,没办法确定用户什么时候会去点击,所以这里oBox.id会时时存在;

另一种写法
fn();
function fn(){
    var oBox = document.getElementById( 'box' );
    oBox.onclick = function (){
        var a = this.id;  会被回收
    }                    
}

this只有当事件触发时才会指向谁,在没有点击的时候不会有指向,所以会被回收;
前提是:后面没有oBox的应用;

什么是闭包

当一个函数里嵌套了一个函数
内部函数引用了外部函数的参数或者变量
那么这个参数/变量不会被回收,这样就形成一个闭包

var b = fn();  // b {var a = 20;    return function (){ a ++;  alert( a );  }}
b();// var a = 20;    return function (){ a ++;  alert( a );  }  弹出21 
b();// a = 21;    return function (){ a ++;  alert( a );  }  弹出22
b();// a = 22;    return function (){ a ++;  alert( a );  }  弹出23
fn()(); fn()===> var a = 20;    return function (){ a ++;  alert( a );  }
                fn()()再让上面的函数执行 function (){ a ++;  alert( a );  弹出 21
function fn(){  ===>嵌套
  var a = 20; ==>不会被回收
  return function (){
    a ++;
    alert( a ); 内部引用a
  }
}

这里fn()()各b是不同的闭包,是2个闭包

闭包的应用

0

1

2

3

4

5

var oBox = document.getElementById ( 'box' ), aP = oBox.getElementsByTagName( 'p' ), length = aP.length; for( var i=0 ; i调用上面的变量 x 不会被回收 } } fn(i); ==>传i进去 } 注意:这里产生了5个闭包 function fn(){ var x = 0 ; aP[0].onclick = function (){ //嵌套函数 alert( 0 ); //点击哪个弹出对应的序号; ===>调用上面的变量 x 不会被回收 } } fn(0); ==>传i进去 function fn(){ var x = 1 ; aP[0].onclick = function (){ //嵌套函数 alert(1 ); //点击哪个弹出对应的序号; ===>调用上面的变量 x 不会被回收 } } fn(1); ==>传i进去 ... 一直到5

上面定义一个函数马上就执行,我们可以写成自执行的形式,可以减少一个变量名;

for( var i=0 ; i

应用二、

二、

你可能感兴趣的:(JavaScript基础 闭包)