关于我理解的闭包(一)

闭包是什么?

《js高级程序设计》这样指出:闭包是指有权访问另一个函数作用域中的变量的函数

首先它是一个函数,其次它还可以访问另一个函数作用域中的变量


看下面一个例子:

function foo(){

     var a=10;

    function bar(){

         a*=2;

     

    }

扫描二维码关注公众号,回复: 2780099 查看本文章

    bar();

    return a;

}


foo();//结果是20


因为bar在foo的作用域中,当执行bar()时,发现a没有在bar函数中定义,根据函数作用域,他会往上一层查找(也就是foo函数作用域)找到了a,计算并返回结果



function foo(){

    var a=10;

    function bar(){

    a*=2;

   return a;

   }

    return bar;

}

var baz=foo();

baz();//20

baz();//40

baz();//80

在上述代码中,所返回的对bar函数的引用被赋给变量baz。这个函数现在是在foo函数的外部调用,但它依然可以访问a。因为javascript中的作用域是词法性的。函数是运行在定义他们的作用域中(本例中是foo内部的作用域),而不是运行在调用他们的作用域中。只要bar被定义在foo中,它就能访问在foo中定义的所有变量,即使foo的执行已经结束.


如果还不懂的地方,可以去看看《js高级程序设计》《js设计模式》两本书可以做对比

猜你喜欢

转载自blog.csdn.net/qq_39081958/article/details/78846120