MST

星途 面试题库

面试题:JavaScript函数返回值与作用域:闭包中的作用域与返回值

编写一个JavaScript函数,该函数返回一个内部函数,内部函数可以访问外部函数的局部变量,形成闭包。同时,解释闭包中作用域是如何保持的,以及返回的内部函数在不同调用场景下对外部函数变量的影响。
45.1万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
function outerFunction() {
    let outerVariable = 10;
    return function innerFunction() {
        return outerVariable;
    };
}

// 使用闭包
const closure = outerFunction();
console.log(closure()); 

闭包中作用域保持原理

  1. 词法作用域:JavaScript采用词法作用域(静态作用域),函数定义时就确定了其作用域。在outerFunction中定义的innerFunction,它的作用域链包含了outerFunction的作用域,这使得innerFunction可以访问outerFunction中的局部变量outerVariable
  2. 作用域链:当innerFunction被调用时,JavaScript引擎会沿着作用域链查找变量。首先在innerFunction自身作用域查找,找不到则到outerFunction作用域查找,以此类推直到全局作用域。只要innerFunction存在,outerFunction的作用域就不会被垃圾回收机制回收,从而保持了对outerVariable的访问。

返回的内部函数在不同调用场景下对外部函数变量的影响

  1. 多次调用内部函数:每次调用返回的内部函数,都会访问并使用相同的外部函数变量。例如,若在innerFunction中修改outerVariable
function outerFunction() {
    let outerVariable = 10;
    return function innerFunction() {
        outerVariable++;
        return outerVariable;
    };
}

const closure = outerFunction();
console.log(closure()); 
console.log(closure()); 

每次调用closureouterVariable的值都会持续增加,因为每次调用都操作的是同一个outerVariable。 2. 多个内部函数实例:如果多次调用outerFunction,会产生多个不同的闭包实例,每个实例都有自己独立的外部函数变量副本。

const closure1 = outerFunction();
const closure2 = outerFunction();

console.log(closure1()); 
console.log(closure2()); 

closure1closure2分别对应不同的outerFunction调用,它们的outerVariable是相互独立的,彼此的操作不会相互影响。