当前位置 博文首页 > 小丞同学:js闭包和包装类

    小丞同学:js闭包和包装类

    作者:[db:作者] 时间:2021-07-20 18:42

    闭包

    内部函数被返回到外部,函数本身保留了父函数的AO,即使父元素执行完了,取消对AO的引用,但依旧被子函数保留下来了,就形成了闭包。

    闭包会导致原有作用域链不释放,造成内存泄漏。

    作用

    1. 实现公有变量(累加器)

    因为子函数保留有父函数的AO,并在此基础上搭建自己的AO,所以父函数的AO会被作为一个公有变量被使用,即使函数执行完毕,也只会销毁自己创建的AO对象。

    1. 实现封装,属性私有化

    简单理解就是函数结束会销毁父函数的执行上下文,但是应用闭包可以使父函数的执行上下文被保留下来,给父函数下的其他函数使用,这样就实现了属性的私有化

    1. 模块化开发

    2. 防止污染全局变量

    var name = 'abc';//全局变量
    var init = (function() {
        var name = 'ljc';
        function callName() {
            console.log(name);
        }
        return function () {
            callName();
        }//返回一个函数形成闭包,留有父函数的AO{name: 'ljc'}
    }())
    init();//ljc
    
    1. 缓存(存储结构)

    防范

    闭包会导致多个执行函数共用一个公有变量,应当尽量避免

    利用闭包解决for循环绑定事件的问题

    function test(){
       var liCollection = document.getElementByTagName('li');
       for(var i = 0; i < liCollection.length; i++){
          (function (j){
             liCollection[j].onclick = function(){ //把函数绑定到了每个li元素(外部)
                console.log(i);
             }
          }(i))
       }
    }
    test();
    

    包装类

    原始值没有属性和方法,强行添加属性或者访问属性的话,系统就会新建一个包装类,然后在包装类上进行操作,操作完成后再销毁。

    var num = 4;//这里的num是原始值没有属性和方法
    
    num.len = 3;//强行添加属性
    //new Number(4).len = 3;执行完立刻销毁 delete
    //再次调用的时候再次生成Number()
    //new Number(4).len
    consloe.log(num.len);
    

    数组在改小length的时候会被截短

    cs
    下一篇:没有了