当前位置 主页 > 服务器问题 > win服务器问题汇总 >

    通俗易懂地解释JS中的闭包(2)

    栏目:win服务器问题汇总 时间:2019-12-02 10:10

    那么【"闭包就是一个引用了父环境的对象,并且从父环境中返回到更高层的环境中的一个对象。"】如何理解?

    我们换个说法:如果一个函数引用了父环境中的对象,并且在这个函数中把这个对象返回到了更高层的环境中,那么,这个函数就是闭包。

    还是看上面的例子:

    getName 函数中引用了 user(父)环境中的对象(变量 name),并且在函数中把 name 变量返回到了全局环境(更高层的环境)中,因此,getName 就是闭包。

    3. "JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里."

    这句话对闭包中对变量的引用的理解很有帮助。我们看下面的例子:

    var name = 'Schopenhauer'
    function getName () {
     console.log(name)
    }
    function myName () {
     var name = 'wangxi'
     getName()
    }
    myName() // Schopenhauer

    如果执行 myName() 输出的结果和你想象的不一样,你就要再回去看看上面说的这句话了,

    JavaScript 中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里

    执行 myName,函数内部执行了 getName,而 getName 是在全局环境下定义的,因此尽管在 myName 中定义了变量 name,对getName 的执行并无影响,getName 中打印的依然是全局作用域下的 name。

    我们稍微改一下代码:

    var name = 'Schopenhauer'
    function getName () {
      var name = 'Aristotle'
     var intro = function() { // 这是一个闭包
      console.log('I am ' + name)
     }
     return intro
    }
    function showMyName () {
     var name = 'wangxi'
     var myName = getName()
     myName()
    }
    showMyName() // I am Aristotle

    结果和你想象的一样吗?结果留作聪明的你自己分析~

    以上就是对 js 中闭包的理解,如果有误,欢迎指正。最后引用一段知乎问题下关于闭包概念的一个回答。

    什么是闭包?

    简单来说,闭包是指可以访问另一个函数作用域变量的函数,一般是定义在外层函数中的内层函数。

    为什么需要闭包?

    局部变量无法共享和长久的保存,而全局变量可能造成变量污染,所以我们希望有一种机制既可以长久的保存变量又不会造成全局污染。

    特点

    占用更多内存 不容易被释放

    何时使用?

    变量既想反复使用,又想避免全局污染

    如何使用?

    定义外层函数,封装被保护的局部变量。 定义内层函数,执行对外部函数变量的操作。 外层函数返回内层函数的对象,并且外层函数被调用,结果保存在一个全局的变量中。

    好了,以上所述是小编给大家介绍的js中的闭包,希望对大家有所帮助!