JavaScript闭包

来源:互联网 发布:手机淘宝一元秒杀攻略 编辑:程序博客网 时间:2024/05/18 03:13

    谈到JavaScript的闭包必然离不开作用域。在JavaScript里,作用域分为全局作用域(在任何地方都能访问)和局部作用域(在指定的代码片段内能访问)。

1、局部作用域通常是函数内部作用域,在函数外部是无法直接访问函数内部定义的局部变量。看如下代码:

    function fun () {

        var age = 18;

    }

    console.log(age)    //Uncaught ReferenceError: age is not defined  报错,age未定义

    由此可见,在fun函数外部是无法访问函数fun内部的age变量的

2、闭包则提供了一种在局部作用域外访问局部作用域内部变量的途径。看如下代码:

    function fun () {

        var age = 18;

        function getAge () {

            age++

            return age

        }

        return getAge

    }

    var foo = fun()

    console.log(foo())    //19    第一次运算的结果

    console.log(foo())    //20    age并没有被回收,一直存在,所以第二次运算是:19++则是20,而不是重新定义age=18

    console.log(foo())    //21    age并没有被回收,一直存在,所以第三次运算是:20++则是21,而不是重新定义age=18

    我们在函数fun外部成功的获取到了函数fun内部的局部变量age。可以看出,fun函数的返回值是一个调用了局部变量age的函数getAge,那么在fun外部调用fun时能得到fun函数的内部函数getAge,而这个内部函数getAge是可以访问fun内部的局部变量age的,所以我们能够在函数fun外访问到age。由于函数fun可在对应的作用域内调用,且调用时需要访问它内部的局部变量age,所以fun内部的age需要一直存在,直到fun被回收。

3、闭包的应用场景

    a、由于函数fun内部的age变量会一直存在,那么可以用来做变量值的长期保存。

    b、当某些变量需要限制访问权限,做变量保护时,就可以使用闭包,提供指定的访问接口访问变量。





    --------------------------------------------分割线啊分割线--------------------------------------------------

        总结下前端学习感悟,如有错误,欢迎拍砖