面试题答案
一键面试闭包的概念
闭包是指在JavaScript中,函数可以访问其外部函数作用域中的变量,即使外部函数已经执行完毕并返回。闭包本质上是一个函数和其周围状态(词法环境)的组合。
举例通过闭包访问外部函数作用域中的变量
function outerFunction() {
let outerVariable = '我是外部函数的变量';
function innerFunction() {
console.log(outerVariable);
}
return innerFunction;
}
let closure = outerFunction();
closure();
在上述代码中,outerFunction
返回了innerFunction
,innerFunction
形成了闭包,它可以访问outerFunction
作用域中的outerVariable
变量,即使outerFunction
已经执行完毕。
作用域链在闭包形成过程中的作用
当函数被创建时,会生成一个作用域链。作用域链本质上是一个对象列表,它定义了函数在查找变量时的搜索路径。在闭包形成过程中,内部函数的作用域链会包含外部函数的活动对象(词法环境)。当内部函数访问变量时,会首先在自身的作用域中查找,如果找不到,就会沿着作用域链向上在外部函数的作用域中查找,以此类推,直到全局作用域。这样,闭包就可以访问到外部函数作用域中的变量,通过作用域链维持了对外部变量的引用,使得外部变量不会因外部函数执行结束而被垃圾回收机制回收。