js-闭包

闭包

利用作用域的嵌套,实现了将局部变量进化成私有(自由)变量,然后可以被原本不能获取到的作用域获取到的环境,叫闭包

概念

JavaScript 闭包的本质源自两点,词法作用域和函数当作值传递。

词法作用域,就是,按照代码书写时的样子,内部函数可以访问函数外面的变量。引擎通过数据结构和算法表示一个函数,使得在代码解释执行时按照词法作用域的规则,可以访问外围的变量,这些变量就登记在相应的数据结构中。

函数当作值传递,即所谓的first class对象。就是可以把函数当作一个值来赋值,当作参数传给别的函数,也可以把函数当作一个值 return。一个函数被当作值返回时,也就相当于返回了一个通道,这个通道可以访问这个函数词法作用域中的变量,即函数所需要的数据结构保存了下来,数据结构中的值在外层函数执行时创建,外层函数执行完毕时理因销毁,但由于内部函数作为值返回出去,这些值得以保存下来。而且无法直接访问,必须通过返回的函数。这也就是私有性。

垃圾回收机制

内存的:删除就删除,没了

硬盘的:暂存到回收站,还在,可以找到继续使用

闭包特点

  1. 可以在全局修改局部
  2. 连接函数内外部的桥梁
  3. IE9~浏览器会造成内存泄漏
  4. 占内存
  5. 避免全局变量命名空间的污染

应用场景

事件委托的封装

obox.onclick = eveEnt(achild, function () {});

function eveEnt(arr, cb) {
    return function () {
        arr
        cb
    }
}

循环中的事件需要获取循环中的变量

for(var i in arr){
    arr[i].onclick = function(i){
        return funtion(){
            console.log(i);
        }
    }
}

baidu
for(var i = 0;i < oLis.length;i ++){
    ;(function(i){
        oLis[i].onclick = function(){
            alert(i); //0123
        }
    })(i);

计时器的回调函数,想传参

setTimeout(fn("world"), 1000);

function fn(data){

    return function(){

        console.log(data);

    }

}