js-闭包

来源:互联网 发布:工艺角 知乎 编辑:程序博客网 时间:2024/05/29 08:47

书本上的定义太深奥,网上的版本又多样,还是记一下自己的理解吧!
简单说闭包就是:有权访问其他函数作用域变量的函数!其本质还是函数。
简单的例子:

<script>function A() {    var x = 1;    return function () {        x++;        console.log(x);    }}    var rel = A();    rel();//2    rel();//3</script>

这里rel函数就是一个闭包,她可以访问函数A内部变量x的值。
由于rel函数一直在执行A函数,所以A函数内部的变量没有被销毁,这样就实现了保存变量的目的。

闭包注意事项

    • 判断作用域指向的对象是否一致

      例一:

  <script>function A() {    var x = 1;    return function () {        x++;        console.log(x);    }}    var rel1 = A();    rel1();//2    rel1();//3    var rel2 = A();    rel2();//2    rel1();//4</script>  

rel1和rel2都重新引用了函数A,是相互独立的。函数被引用时,她才创建执行环境和变量对象,当函数执行完毕后,就会销毁其执行环境和变量对象,这是js函数的执行机制。
例二:

function A() {    var x = 1;    var rel = [];    rel[0] = function () {        x++;        console.log(x);    };    rel[1] = function () {        x++;        console.log(x);    };    return rel;}    var fun = A();//第一次运行A返回一个数组,这个数组包含了两个函数    fun[0]();//2    fun[1]();//3</script>

这里A只运行了一次,所以fun[0]和fun[1]两个函数指向的都是一个变量对象。

  • 变量的值的判断
    《JavaScript高级程序设计》一书中有这样一个经典的例子:
<script>    function A() {        var funs = [];        for(var i=0;i<10;i++){            funs[i] = function B(num) {                return function C() {                    return num;                }            }(i)        }        return funs;    }    var funs = A();//定义funs[0]到funs[9]这九个函数    console.log(funs[3]());//3    console.log(funs[6]());//6</script>

B、C函数的名字自己取得,便于解释;funs[i]= function B(num)(i)是个立即执行函数,及时把i的值传给局部变量num被函数C存起来,这样就B立即被执行了10次,B就生成10个活动变量!

1 0