JavaScript闭包

简介: 版权声明:本文为博主原创文章,转载请注明出处。 https://blog.
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/60592592

闭包

1,闭包可以让局部变量驻留在内存中,而不会重复初始化
2,过度使用会导致内存占用过高,因此用完后应及时解除引用:

b = null

        function add(){
            var num = 100;
            return function(){
                return num++;
            };
        };

        var fun3 = add();   // 获得闭包函数,add函数只初始化一次
        alert(fun3());      // 101
        alert(fun3());      // 102
        alert(fun3());      // 103
        alert(fun3());      // 104
        fun3 = null;        // 过多的使用闭包会占用大量内存,使用完后要释放闭包函数:
        alert(fun3());      // 报错

以循环里的匿名函数的取值为例,分三种情况:
<1>: 返回的闭包函数由于是在sum执行完后再执行,所以返回的值都是5.数组中保存的是匿名函数,需要用函数的方式调用。

    // 001  
        function sum(){
            var arr = new Array();
            for(var i=0;i<5;i++){
                arr[i] = function(){
                    return i;
                }
            };

            return arr;
        };

        var data = sum();
        for( var i=0;i<5;i++){      // 全部是5
            alert(data[i]());
        }

<2>: 利用函数的自我执行即时的给数组赋值,返回的数组内容是数字

    // 002 
        function sum(){
            var arr = new Array();
            for(var i=0;i<5;i++){
                arr[i] = (function(num){        // 匿名函数的即时执行
                    return num;
                })(i);
            };

            return arr;
        };

        var data = sum();
        for( var i=0;i<5;i++){      // 正常
            alert(data[i]);
        }

<3>: 使用函数的自我执行的同时返回一个匿名函数,返回的数组需要当成函数调用

    // 003 
        function sum(){
            var arr = new Array();
            for(var i=0;i<5;i++){
                arr[i] = function(num){     // 匿名函数的即时执行
                    return function(){
                        return num; 
                    };
                }(i);
            };

            return arr;
        };

        var data = sum();
        for( var i=0;i<5;i++){      // 正常
            alert(data[i]());
        }

闭包中的this

闭包中的this指向window,闭包并不属于某个对象的属性和方法。解决方法:对象冒充。

    var flag = "window";

    var box = {
        flag : "box",
        fun : function(){
            return function(){
                return this.flag;
            }
        }
    };
    alert(box.fun()());     // 闭包的this指向window

可以使用以下的方法解决,不直接使用闭包中的this,而是保存普通函数中的this,再在闭包中调用:

    var box2 = {
        flag : "box",
        fun : function(){
            var sss = this;
            return function(){
                return sss.flag;
            }
        }
    };
    alert(box2.fun()());        // box2

使用call或者apply更改作用域也可以解决问题:

    var box3 = {
        flag : "box",
        fun : function(){
            return function(){
                return this.flag;
            }
        }
    };

    alert(box3.fun().call(box3));

私有作用域

JavaScript没有块级作用域,但是自我执行的匿名函数有私有作用域,作用域中的变量在执行完后就被销毁,在作用域外无法被调用。可以减少全局变量的使用。

    (function(){
        for(var i=0;i<5;i++){}
    })();
    alert(i);       // undefined

私有变量

this.属性或this.方法表示的是共有方法和属性。但是在方法中用var声明的方法或属性是私有属性,外部无法调用,用该函数创建的对象也无法使用私有属性。

        function Person(str){
            var name = str;         // 私有属性
            var fun = function(){   // 私有方法
                return name+"###";
            };
        };
        var tom = new Person("Tom");

        alert(tom.fun());       // 报错
        alert(tom.name);        // 报错
相关文章
|
2月前
|
自然语言处理 JavaScript 前端开发
JavaScript中闭包:概念、用途与潜在问题
【4月更文挑战第22天】JavaScript中的闭包是函数及其相关词法环境的组合,允许访问外部作用域,常用于数据封装、回调函数和装饰器。然而,不恰当使用可能导致内存泄漏和性能下降。为避免问题,需及时解除引用,减少不必要的闭包,以及优化闭包使用。理解并慎用闭包是关键。
|
2月前
|
JavaScript 前端开发
JavaScript 闭包:让你更深入了解函数和作用域
JavaScript 闭包:让你更深入了解函数和作用域
|
9天前
|
自然语言处理 JavaScript 前端开发
JavaScript闭包是函数访问外部作用域变量的能力体现,它用于封装私有变量、持久化状态、避免全局污染和处理异步操作。
【6月更文挑战第25天】JavaScript闭包是函数访问外部作用域变量的能力体现,它用于封装私有变量、持久化状态、避免全局污染和处理异步操作。闭包基于作用域链和垃圾回收机制,允许函数记住其定义时的环境。例如,`createCounter`函数返回的内部函数能访问并更新`count`,每次调用`counter()`计数器递增,展示了闭包维持状态的特性。
25 5
|
16天前
|
设计模式 自然语言处理 JavaScript
JavaScript进阶-函数表达式与闭包
【6月更文挑战第18天】JavaScript函数不仅是代码块,还是值,具备函数表达式和闭包等特性。函数表达式如匿名函数,可赋值、传参,但不提升,过度使用影响可读性。闭包允许访问外部作用域,即使父函数已结束,但不当使用可能导致内存泄漏。理解并妥善处理这些问题,如命名函数表达式、及时释放引用,能提升代码质量。通过实践深化对这些关键概念的理解至关重要。
|
1天前
|
存储 缓存 JavaScript
js 【详解】闭包
js 【详解】闭包
7 0
|
2天前
|
自然语言处理 前端开发 JavaScript
前端 JS 经典:闭包与内存泄漏、垃圾回收
前端 JS 经典:闭包与内存泄漏、垃圾回收
6 0
|
7天前
|
JavaScript 前端开发 Java
javascript闭包详解
javascript闭包详解
|
17天前
|
缓存 前端开发 JavaScript
【JavaScript】JavaScript 中的闭包:从入门到精通
【JavaScript】JavaScript 中的闭包:从入门到精通
30 0
|
2月前
|
缓存 自然语言处理 JavaScript
JavaScript内存泄漏导致应用性能下降,常见于闭包使用不当
【5月更文挑战第14天】JavaScript内存泄漏导致应用性能下降,常见于闭包使用不当。闭包能记住并访问词法作用域,若函数返回后,其引用的对象未被释放,就会引发泄漏。例如,`createLeakyFunction`创建的闭包保留了对大型对象`someLargeObject`的引用,即使函数执行完毕,对象也无法被垃圾回收。避免泄漏的方法包括及时解除引用、清除事件监听器、使用WeakMap和WeakSet以及定期清理缓存。使用性能分析工具可检测和修复内存泄漏问题。
27 3
|
2月前
|
自然语言处理 JavaScript 前端开发
深入理解JavaScript中的闭包机制
闭包是JavaScript中一个重要且常被误解的概念。本文将深入探讨闭包的本质、工作原理以及在实际开发中的应用。通过详细解析闭包的定义、作用域链、内存管理等方面,读者将对闭包有更清晰的理解,并能够运用闭包解决实际开发中的问题。