it编程 > 编程语言 > Javascript

JavaScript闭包的深度剖析与实际应用小结

29人参与 2025-02-14 Javascript

前言

本文将通过一系列代码片段详细探讨闭包的概念、作用、原理及其优缺点,并结合具体实例进行分析。希望通过这篇文章,读者能够对闭包有更深刻的理解。

一、什么是闭包?

简单定义

闭包是指一个函数能够记住并访问它的词法作用域,即使这个函数在其词法作用域之外执行。换句话说,闭包让一个函数可以访问另一个函数中的局部变量,即使外部函数已经调用结束被释放后,依然可以访问这些变量。

代码示例1:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>document</title>
</head>
<body>
    <script>
        function fn(){
            var a = 3;
            return function (){  // 闭包函数
                return a;
            }
        }
        function fun(){
            var ff = fn();  // function me(){return a;}
            alert(ff());  // 输出3
        }
        fun();
    </script>
</body>
</html>

代码解析:

二、闭包的作用

解决全局变量污染的问题

闭包可以帮助我们将一些不需要暴露给全局作用域的变量封装起来,避免全局变量的污染。通过闭包,我们可以创建私有变量和方法,从而提高代码的安全性和可维护性。

代码示例2:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>document</title>
</head>
<body>
    <script>
        // 全局变量累加和
        var a = 1;
        function fn(){
            a ++;
        }
        fn();
        console.log(a); // 2
        fn();
        console.log(a); // 3
        fn();
        console.log(a); // 4
    </script>
</body>
</html>

代码解析:

使用闭包改进:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>document</title>
</head>
<body>
    <script>
        // 局部变量累加和
        function fn(){
            var a = 1;
            return function(){
                return ++ a;
            }
        }
        let fun = fn();  // function(){}
        console.log(fun()); // 2
        console.log(fun()); // 3
        console.log(fun()); // 4
    </script>
</body>
</html>

代码解析:

三、闭包的原理

浏览器的垃圾回收机制

当一个函数执行完毕后,通常其内部的局部变量会被销毁。但是,如果这些局部变量被其他函数引用,则它们不会被销毁。这是因为闭包的存在使得这些变量仍然处于活动状态,浏览器的垃圾回收机制不会回收这些变量,直到所有引用它们的闭包都被销毁。

代码示例3:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>document</title>
</head>
<body>
    <script>
        function fn(){
            // 声明一个数组
            let arr = [];
            // 循环添加数据
            for(var i = 0;i < 5;i ++){
                arr[i] = function(i){ // 0 1 2 3 4
                    return function(){
                        return i;
                    };
                }(i);
            }
            return arr; // 返回数组
        }
        let list = fn();
        for(var i = 0,len = list.length;i < len;i ++){
            console.log(list[i]()); // 01234
        }
    </script>
</body>
</html>

代码解析:

四、闭包的优缺点

优点

缺点

代码示例4:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>document</title>
</head>
<body>
    <script>
        function fn(){
            // 声明一个数组
            let arr = [];
            // 循环添加数据
            for(var i = 0;i < 5;i ++){
                arr[i] = function(){
                    return i;
                }();
            }
            return arr; // 返回数组
        }
        let list = fn();
        for(var i = 0,len = list.length;i < len;i ++){
            console.log(list[i]); // 0 1 2 3 4
        }
    </script>
</body>
</html>

代码解析:

五、总结与展望

结束语

通过上述代码片段和解析,我们深入探讨了javascript中的闭包概念、作用、原理及其优缺点。闭包作为javascript中一个强大的特性,既能帮助我们解决许多编程难题,也需要注意其潜在的风险。合理使用闭包,可以在保证代码安全性和性能的前提下,编写出更加简洁高效的程序。

未来展望

随着javascript的发展,闭包的应用场景也在不断扩展。现代javascript框架如react、vue等广泛使用闭包来实现组件的状态管理和生命周期管理。因此,深入理解闭包不仅是掌握javascript的基础,更是迈向高级编程的重要一步。

到此这篇关于javascript闭包的深度剖析与实际应用的文章就介绍到这了,更多相关js闭包应用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

JS中循环遍历数组的几种常用方式总结

02-14

uni-app集成使用SQLite数据库的方法步骤

02-14

使用JavaScript操作本地存储

02-14

前端本地数据存储的几种常见方式总结

02-14

JavaScript DOM操作与事件处理方法

02-14

使用JavaScript将PDF页面中的标注扁平化的操作指南

02-14

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论