JS之闭包

简介: JS之闭包

闭包的概念:

一个函数对周围状态的引用捆绑在一起,内层函数中访问到其外层函数的作用域

简单理解: 闭包=内层函数 + 外层函数的变量

闭包的作用:封闭数据,提供操作,外部也可以访问函数内部的变量

闭包的特性:
1.函数嵌套函数
2.函数内部可以引用函数外部的参数和变量
3.参数和变量不会被垃圾回收机制回收

闭包的优点:
1.保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突
2.在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)
3.匿名自执行函数可以减少内存消耗

闭包的缺点:
1.其中一点上面已经有体现了,就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;
2.其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响

闭包基本格式:

// 外层函数
    function fun(){
        // 外层函数变量
        let num = 1
        // 内层函数
        function fn() {
            console.log(num) //1
        }
        //外层函数使用内部函数的变量
        return fn
    }
    let f = fun()
    f() //1

简约写法:

function fun() {
        // 外层函数变量
        let num = 1
        // 内层函数
        return function () {
            console.log(num) //1
        }
    }
    let f = fun()
    f()

实践:统计函数调用的次数

传统写法:

let i = 0
    function fun(){
        i++
        console.log(i)
    }
    fun()//调用一次就i++

但是这个 i 是全局变量,很容易被修改

接下来我们使用闭包的形式:

function fun() {
        let i = 0
        function fn() {
            i++
            console.log(i)
        }
        return fn
    }
    let f = fun()
    f() //调用一次就i++

这样 i 就不会被修改,实现了数据私有

但可能会引起内存泄漏

感谢大家的阅读,如有不对的地方,可以向我提出,感谢大家!

相关文章
|
24天前
|
JavaScript
闭包(js的问题)
闭包(js的问题)
12 0
|
1月前
|
设计模式 JavaScript 前端开发
js开发:请解释闭包(closure)是什么,以及它的用途。
闭包是JavaScript中的关键特性,允许函数访问并操作外部作用域的变量,常用于实现私有变量、模块化和高阶函数。私有变量示例展示了如何创建无法外部访问的计数器;模块化示例演示了封装私有变量和函数,防止全局污染;高阶函数示例则说明了如何使用闭包创建能接收或返回函数的函数。
16 2
|
1月前
|
自然语言处理 JavaScript 前端开发
探索JavaScript中的闭包:理解其原理与实际应用
探索JavaScript中的闭包:理解其原理与实际应用
20 0
|
1月前
|
自然语言处理 JavaScript 前端开发
深入理解JS的执行上下文、词法作用域和闭包(中)
深入理解JS的执行上下文、词法作用域和闭包(中)
|
1月前
|
存储 自然语言处理 JavaScript
深入理解JS的执行上下文、词法作用域和闭包(上)
深入理解JS的执行上下文、词法作用域和闭包(上)
|
3天前
|
测试技术
js_防抖与节流(闭包的使用)
js_防抖与节流(闭包的使用)
8 0
|
1月前
|
JavaScript 前端开发 Java
深入剖析 JavaScript 闭包
深入探讨JavaScript闭包,了解其定义、特性、优缺点及作用。闭包是函数与其引用环境的组合,允许内层函数访问外层作用域,常驻内存可能导致内存泄露。优点包括创建私有变量,缺点则涉及内存使用。闭包在变量搜索中遵循从内到外的规则,并影响变量的作用域和生存周期。理解闭包有助于优化代码并避免性能问题。
21 1
|
1月前
|
自然语言处理 前端开发 JavaScript
深入理解JavaScript中的闭包与作用域链
在JavaScript编程中,闭包和作用域链是两个非常重要的概念,它们对于理解代码的执行过程和解决一些特定问题至关重要。本文将深入探讨JavaScript中闭包和作用域链的原理和应用,帮助读者更好地理解这些概念并能够在实际项目中灵活运用。
|
1月前
|
JavaScript 前端开发
javascript闭包的理解(菜菜必看系列!!!)
javascript闭包的理解(菜菜必看系列!!!)
|
1月前
|
自然语言处理 JavaScript 前端开发
深入理解JS的执行上下文、词法作用域和闭包(下)
深入理解JS的执行上下文、词法作用域和闭包(下)