第一次写文章,自己学习用的,按着自己的理解去写的,如写的不好,请多多指教,多多交流。
闭包是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/…