MST

星途 面试题库

面试题:JavaScript闭包与作用域链基础应用

请解释JavaScript中闭包的概念,并举例说明如何通过闭包访问外部函数作用域中的变量。另外,描述一下作用域链在闭包形成过程中起到的作用。
27.9万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

闭包的概念

闭包是指在JavaScript中,函数可以访问其外部函数作用域中的变量,即使外部函数已经执行完毕并返回。闭包本质上是一个函数和其周围状态(词法环境)的组合。

举例通过闭包访问外部函数作用域中的变量

function outerFunction() {
    let outerVariable = '我是外部函数的变量';
    function innerFunction() {
        console.log(outerVariable);
    }
    return innerFunction;
}
let closure = outerFunction();
closure(); 

在上述代码中,outerFunction返回了innerFunctioninnerFunction形成了闭包,它可以访问outerFunction作用域中的outerVariable变量,即使outerFunction已经执行完毕。

作用域链在闭包形成过程中的作用

当函数被创建时,会生成一个作用域链。作用域链本质上是一个对象列表,它定义了函数在查找变量时的搜索路径。在闭包形成过程中,内部函数的作用域链会包含外部函数的活动对象(词法环境)。当内部函数访问变量时,会首先在自身的作用域中查找,如果找不到,就会沿着作用域链向上在外部函数的作用域中查找,以此类推,直到全局作用域。这样,闭包就可以访问到外部函数作用域中的变量,通过作用域链维持了对外部变量的引用,使得外部变量不会因外部函数执行结束而被垃圾回收机制回收。