闭包

185 阅读2分钟

       第一次写文章,自己学习用的,按着自己的理解去写的,如写的不好,请多多指教,多多交流。

        闭包是JS中很强大的特性之一,由于JS的函数可以嵌套,并且函数作用域的作用,导致内部函数可以访问外部作用域的变量和函数,但是外部却不能访问内部函数的变量和函数。闭包就应运而生,闭包简单的理解:当内部函数以某种方式被外部任何一个作用域访问时,就形成了一个闭包。无论通过什么方法将内部函数传递到所在的词法作用域以外,内部函数都持有对原始定义作用域的引用,当无论什么时候使用该函数时,都会使用到闭包)

function example () { 
    let str = 'test'
    function getName() {
        console.log(str)
    }
    return getName //返回这个内部函数,从而将其暴露在外部函数作用域
}
const getSrt = example()

getSrt() // test

        example 返回出getName函数,导致getName被外部词法作用域所访问到,但是getName还保留着对example的作用域的引用,形成了闭包。

闭包很常见,你已经写过的代码中一定到处都是闭包的身影。例如:

function wait(message) {
    setTimeout( function timer() {
        console.log( message );
    }, 1000 ); 
}
wait( "Hello, closure!" );

        将一个内部函数(名为 timer)传递给 setTimeout(..)。timer 具有涵盖 wait(..) 作用域

的闭包,因此还保有对变量 message 的引用。

wait(..) 执行 1000 毫秒后,它的内部作用域并不会消失,timer 函数依然保有 wait(..)

作用域的闭包。

        深入到引擎的内部原理中,内置的工具函数 setTimeout(..) 持有对一个参数的引用,这个

参数也许叫作 fn 或者 func,或者其他类似的名字。引擎会调用这个函数,在例子中就是

内部的 timer 函数,而词法作用域在这个过程中保持完整。

这就是闭包。

可以参考:MDN developer.mozilla.org/zh-CN/docs/…