美文网首页
[前端]什么是闭包?

[前端]什么是闭包?

作者: 半颗糖嘿 | 来源:发表于2022-10-14 18:59 被阅读0次

    1)什么是闭包?
    当一个函数里面返回另一个函数的形式,就称为闭包。
    eg:

    function fn() {
      var a = 1;
      return function() {
        return a;
      }
    }
    var b = fn();
    console.log(b());// 1
    

    2)闭包的作用:打破函数作用域的限制,当前函数的作用域外访问函数内部的私有成员,延长变量的声明周期。
    3)特点:
    ①打破了作用域的限制,让全局访问局部变量成为可能。
    ②局部变量常驻内存中------》内存空间长期被占用(弊端),会造成内存泄漏(有一块内存空间被长期占用,而不被释放)。
    ③归根结底还是局部变量------》防止了全局变量的污染。
    4)应用场景
    场景一:模块封装,防止变量污染全局

    var Mokuai = (function(){
        // 声明为模块私有变量,外界无法直接访问
        var foo = 0;
        function Mokuai(){}
        Mokuai.prototype.bar = function bar(){
            return foo;
        }
        return Mokuai;
    }());
    

    场景二::在循环中创建闭包,防止取到意外的值

    eg:无论哪个元素触发事件,都会弹出5。因为函数执行后引用的i是同一个,而i在循环结束后就是5。
    for(var i = 0;i<5;i++){
        document.getElementById('id'+i).onfocus = function(){
            alert(i);
        }
    }
    // 可用闭包解决
    function makeCallback(num){
        return function(){
            alert(num);
        }
    }
    for(var i = 0;i<5;i++){
        document.getElementById('id'+i).onfocus = makeCallback(i);
    }
    

    相关文章

      网友评论

          本文标题:[前端]什么是闭包?

          本文链接:https://www.haomeiwen.com/subject/ggebartx.html