面试题答案
一键面试function outerFunction() {
let outerVariable = 10;
return function innerFunction() {
return outerVariable;
};
}
// 使用闭包
const closure = outerFunction();
console.log(closure());
闭包中作用域保持原理
- 词法作用域:JavaScript采用词法作用域(静态作用域),函数定义时就确定了其作用域。在
outerFunction
中定义的innerFunction
,它的作用域链包含了outerFunction
的作用域,这使得innerFunction
可以访问outerFunction
中的局部变量outerVariable
。 - 作用域链:当
innerFunction
被调用时,JavaScript引擎会沿着作用域链查找变量。首先在innerFunction
自身作用域查找,找不到则到outerFunction
作用域查找,以此类推直到全局作用域。只要innerFunction
存在,outerFunction
的作用域就不会被垃圾回收机制回收,从而保持了对outerVariable
的访问。
返回的内部函数在不同调用场景下对外部函数变量的影响
- 多次调用内部函数:每次调用返回的内部函数,都会访问并使用相同的外部函数变量。例如,若在
innerFunction
中修改outerVariable
:
function outerFunction() {
let outerVariable = 10;
return function innerFunction() {
outerVariable++;
return outerVariable;
};
}
const closure = outerFunction();
console.log(closure());
console.log(closure());
每次调用closure
,outerVariable
的值都会持续增加,因为每次调用都操作的是同一个outerVariable
。
2. 多个内部函数实例:如果多次调用outerFunction
,会产生多个不同的闭包实例,每个实例都有自己独立的外部函数变量副本。
const closure1 = outerFunction();
const closure2 = outerFunction();
console.log(closure1());
console.log(closure2());
closure1
和closure2
分别对应不同的outerFunction
调用,它们的outerVariable
是相互独立的,彼此的操作不会相互影响。