js闭包

闭包的概念

  • 可简单理解为读取其他函数内部变量的函数
    function a() {
        var i = 0;
        function b() { alert(++i); }
        return b;
    }
    var c = a();
    c();

引用关系如图:

当函数a的内部函数b被函数外的一个变量引用是创建了一个闭包
执行完var c = a()后,变量c指向函数b,执行c(),会弹出i的值。a执行完返回时,闭包会使a所占资源不被收回,函数a返回后a中的i始终存在,每次执行c(),i自加后alert,假如a返回的不是函数b,a只会被b引用,那么执行结束后,a,b被回收(javascript中,一个对象不再被引用则会被回收,两对象互相引用不被第三者引用,两者会被回收)。

闭包的用途

1. 从外部得到函数内部的局部变量

例如:

function f1(){
    var n=999;
    function f2(){
        alert(n);
    }
    return f2;
}
var result = f1();
result()//999

2. 用于让变量的值始终保持在内存里。

例如:

function f1(){
    var n=999;
    nadd = function(){
        n+=1
    }
    function f2(){
        alert(n);
    }
    return f2;
}
var result =f1();
result();//999
nadd();
result();//100

result运行了两次,f1中的局部变量没有清除。

php闭包语法:use

$arg ='text';
$test = function() use($arg) {
    var_dump($arg);
};
$test();
//输出text
$arg = 'text';
$test = function () use ($arg) {
    var_dump($arg);
    $arg = 'text2';
};
$test();//输出test
$arg = 'text3';
$test();//输出test

参考

javascript深入理解js闭包

你可能感兴趣的:(js闭包)