js -- 垃圾回收and闭包

垃圾回收机制

1. 概述

JS的垃圾回收机制是为了以防内存泄漏。
内存泄漏:当已经不需要某块内存时这块内存还存在着,垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存。

2.js垃圾回收方式

标记清除(mark and sweep)、引用计数(reference counting)。

1 标记清除(mark and sweep)
大部分浏览器以此方式进行垃圾回收,当变量进入执行环境(函数中声明变量)的时候,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”,在离开环境之后还有的变量则是需要被删除的变量。

垃圾收集器给内存中的所有变量都加上标记,然后去掉环境中的变量以及被环境中的变量引用的变量的标记。在此之后再被加上的标记的变量即为需要回收的变量,因为环境中的变量已经无法访问到这些变量。

2 引用计数(reference counting)
这种方式常常会引起内存泄漏,低版本的IE使用这种方式。机制就是跟踪一个值的引用次数,当声明一个变量并将一个引用类型赋值给该变量时该值引用次数加1,当这个变量指向其他一个时该值的引用次数便减一。当该值引用次数为0时就会被回收。

3.闭包

( 1 )函数嵌套函数
( 2 )在函数内部可以引用外部的参数和变量
( 3 )参数和变量不会被垃圾回收机制回收

4.闭包优缺点

使用闭包主要是为了设计私有的方法和变量
优点:可以避免全局变量 的污染
缺点:闭包会常驻内存, 增加内存使用 量,使用不当很容易造成内存泄漏

for循环相关知识点
        for (var i = 0; i < 10; i++) {
            setTimeout(() => {
                console.log(i)
            }, 200)
        }//结果 10,10,10,10,10,10,10,10,10,10       
        
        let F = function (i) {
            setTimeout(() => {
                console.log(i)
            }, 200)
        }
        for (var i = 0; i < 10; i++) {
            F(i)
        }//结果:0,1,2,3,4,5,6,7,8,9

        for (var i = 0; i < 10; i++) {
            (function (i) {
                setTimeout(() => {
                    console.log(i)
                }, 200)
            })(i)
        }//结果:0,1,2,3,4,5,6,7,8,9

        for (let i = 0; i < 10; i++) {
            setTimeout(() => {
                console.log(i)
            }, 200)
        }//结果:0,1,2,3,4,5,6,7,8,9
补充:

1.自执行函数之前必须有分号

        var a =6   //这里一定要有分号 ' ;'
        (function(){
            console.log(888)
        })()//6 is not a function

2.关于for循环中 let 块级作用域
设置循环变量得部分是一个父级作用域,而循环体内部是一个单独得子作用域

       for(let i=0;i<3;i++){
                let i='aaa';
                console.log(i)
        }// aaa   aaa   aaa   (三次都为aaa)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容