关于闭包作用域与内存优化

127 阅读2分钟
/*闭包:它是函数运行时候所产生的机制,函数执行会形成一个全新的私有上下
文,可以保护里面的私有变量和外界互不干扰(保护机制),但是大家所认为的
闭包,需要当前上下文不能被出栈释放,这样私有变量及它的值也不会被释放掉
(保存机制);*/
//闭包的作用:保护/保存 
/*
    JS中的内存优化
        【栈内存(执行上下文)】
            一般情况下,函数执行完,所形成的上下文会被出栈释放掉
            特殊情况:当前上下文中某些内容被上下文以外的事物占用了,
            此时不能出栈释放
            全局上下文:加载页面创建的,也只是有页面关闭才会被释放掉
        【堆内存】
            浏览器的垃圾回收机制:
            1.引用计数(以IE为主):某些情况会导致计数混乱,导致内存泄漏
            2.检测引用(占用)(以谷歌为主):浏览器在空闲时候会依次检测
            所有的堆内存,把没有被任何事物占用的内存释放掉,以此来优化
            内存
        [堆内存如果不用可以手动赋值为null释放]
*/
/*
    闭包好不好?
        大量应用闭包肯定会导致内存的消耗,但是闭包保护和保存的作用,
        在真实开发中我们还是需要的,所以需要学会“合理使用闭包”
    闭包应用:
    (ECSTACK/EC/AO/VO/SCOPE/SCOPE-CHAIN/释放不释放/垃圾回收机制...)
        1.实战用途
        2.高阶编程:柯理化/惰性函数/compose函数
        3.源码分析:JQ/LODASH/REACT(REDUX/高阶组件/HOOKS)...
        4.自己封装插件组件的时候
        ...
*/
<body>
    <button>红</button>
    <button>绿</button>
    <button>蓝</button>
</body>
</html>
<script>
    var arr = ['red', 'green', 'blue']
    var buttonList = document.getElementsByTagName('button')
    for (var i = 0; i < buttonList.length; i++) {
        (function (i) {
            buttonList[i].onclick = function () {
                var color = arr[i]
                document.body.style.backgroundColor = color
            }
        })(i)
    }
</script>