【JS进阶】作用域和作用域链、垃圾回收机制、闭包

举报
人才程序员 发表于 2024/02/28 21:03:42 2024/02/28
【摘要】 @TOC 前言在JavaScript编程中,深入理解作用域和作用域链、垃圾回收机制以及闭包是迈向高级开发者的重要一步。这三个概念相互交织,共同构建了JavaScript语言的独特特性和灵活性。本文将深入剖析这些概念,为您揭示它们的本质和相互关系。通过对作用域的理解,我们能更好地组织代码结构;垃圾回收机制为我们提供了便利,使我们无需过多担心内存管理;而闭包,则是JavaScript中的一项强大...

@TOC


前言

在JavaScript编程中,深入理解作用域和作用域链、垃圾回收机制以及闭包是迈向高级开发者的重要一步。这三个概念相互交织,共同构建了JavaScript语言的独特特性和灵活性。本文将深入剖析这些概念,为您揭示它们的本质和相互关系。通过对作用域的理解,我们能更好地组织代码结构;垃圾回收机制为我们提供了便利,使我们无需过多担心内存管理;而闭包,则是JavaScript中的一项强大功能,为我们提供了很多有趣的应用场景。让我们开始探索这些概念,深入挖掘JavaScript的奥秘。


一、作用域和作用域链

1.1 作用域是什么

JavaScript的作用域(Scope)是指在代码中定义变量的区域,这些变量在不同的地方有不同的可见性和访问权限。通俗地说,作用域决定了你在代码中创建的变量在哪里可以被访问以及在哪里是不可见的。
在JavaScript中,有两种主要的作用域:

1.全局作用域(Global Scope):

全局作用域是整个程序范围内可访问的作用域。
在全局作用域中声明的变量可以在代码的任何地方被访问。

let globalVariable = "I am global!";
function exampleFunction() {
    console.log(globalVariable);  // 可以访问全局变量
}

2.局部作用域(Local Scope):

局部作用域是在特定代码块内可访问的作用域,如函数内部或某个语句块内。在局部作用域中声明的变量只能在该作用域内访问。

function exampleFunction() {
    let localVariable = "I am local!";
    console.log(localVariable);  // 可以访问局部变量
}

作用域的概念有助于管理变量的可见性,防止变量冲突,并提供更好的代码结构。当你在编写JavaScript代码时,了解作用域是非常重要的,因为它影响了变量的生命周期和访问方式。

1.2 作用域链

作用域链本质上是底层的变量查找机制
在函数被执行时,会优先查找当前函数作用域中查找变量
如果当前作用域查找不到则会依次逐级查找父级作用域直到全局作用域

总结:
1.嵌套关系的作用域串联起来形成了作用域链
2.相同作用域链中按着从小到大的规则查找变量
3.子作用域能够访问父作用域,父级作用域无法访问子级作用域

二、垃圾回收机制以及算法

2.1 垃圾回收机制GC

JavaScript中的GC(垃圾回收)是一种自动管理内存的机制。通俗地说,GC负责在你的代码运行时,自动检测和释放不再需要的内存,以避免内存泄漏和提高程序性能。

比如,当你在代码中创建了一些变量、对象或数据结构,而后面不再使用它们的时候,这些占用内存的东西需要被清理掉,以便释放内存供其他部分使用。而这个清理工作就是由垃圾回收器来负责的。

垃圾回收的主要工作包括:

标记不再使用的对象:

垃圾回收器会标记那些不再被引用的对象,也就是程序中无法通过任何方式访问到的对象。
清理被标记的对象:

标记完成后,垃圾回收器会清理或回收这些被标记的对象所占用的内存空间,使其可以被重新利用。
垃圾回收的目的是确保你的程序不会因为长时间运行而导致内存消耗过多,从而影响性能。JavaScript中的GC机制让开发者无需手动管理内存,而是由浏览器或JavaScript引擎自动处理,让编写代码变得更加方便和安全。

三、闭包

3.1 闭包是什么

闭包是JavaScript中的一个重要概念,通俗地说,闭包是由函数以及在函数声明时创建的作用域组成的。这个组合使得函数可以访问其外部作用域的变量,即使在函数执行完毕后,这个作用域依然存在。

具体来说,当一个函数内部定义了另一个函数,并且内部函数引用了外部函数的变量时,就形成了闭包。这个内部函数可以在外部函数执行完毕后继续访问外部函数的变量,因为它保持对外部作用域的引用。

举个例子:

function outerFunction() {
    let outerVariable = "I am from outer function";

    function innerFunction() {
        console.log(outerVariable);
    }

    return innerFunction;
}

// 创建一个闭包
const closure = outerFunction();

// 执行闭包,依然可以访问 outerFunction 中的变量
closure();  // 输出 "I am from outer function"

在这个例子中,innerFunction 就形成了一个闭包,因为它引用了外部函数 outerFunction 中的 outerVariable。即使 outerFunction 执行完毕,closure 作为闭包依然能够访问和记住 outerVariable 的值。

闭包的应用场景很多,常见的包括创建私有变量、实现柯里化(Currying)、在异步操作中保存状态等。理解闭包对于编写灵活、功能强大的JavaScript代码是非常重要的。


总结

作用域和作用域链、垃圾回收机制以及闭包构成了JavaScript编程的基石。作用域定义了变量的可见性和访问范围,作用域链描述了变量查找的规则,而垃圾回收机制则负责自动管理内存,防止内存泄漏。闭包是一种强大的特性,使得函数能够保持对外部作用域的引用,创造了更灵活的编程方式。深刻理解这些概念,不仅有助于写出更健壮、高效的代码,也是迈向JavaScript进阶之路的必经之地。在编程的世界里,掌握这些概念就如同拥有了一把打开JavaScript奥秘之门的钥匙。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。