闭包是指一个函数能够访问并操作其外部作用域中的变量,在JavaScript中,我们可以通过创建一个函数内部的另一个函数来实现闭包,这个内部函数可以引用外部函数的变量,即使外部函数已经执行完毕,这个内部函数仍然可以访问这些变量。
下面是一个简单的闭包示例:
function outer() { var a = 1; function inner() { console.log(a); } return inner;}var closureFunc = outer(); // 这里我们得到了一个闭包函数closureFunc(); // 输出 1在这个例子中,outer函数返回了inner函数,当我们调用outer()时,它会创建一个包含变量a的闭包,即使outer函数已经执行完毕,我们仍然可以通过调用closureFunc()来访问a的值,这是因为inner函数仍然可以访问outer函数的作用域。
要获取闭包内的变量值,我们需要使用词法环境(lexical environment)的概念,词法环境是一个对象,包含了变量名和它们对应的值,当解析器遇到一个变量名时,它会在当前词法环境中查找该变量名对应的值,如果找到了,就将其添加到当前词法环境中;如果没有找到,就在全局作用域中查找。
在上面的例子中,当我们调用closureFunc()时,词法环境首先在outer函数的作用域中查找变量a,找不到;然后在全局作用域中查找,找到了。closureFunc()输出了1。