最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 面试 | JS 闭包经典使用场景和含闭包必刷题

    正文概述 掘金(LinYIYI)   2021-03-09   827

    思维导图

    面试 | JS 闭包经典使用场景和含闭包必刷题

    闭包

    上级作用域的概念

    • 函数的上级作用域在哪里创建创建的,上级作用域就是谁
    var a = 10
    function foo(){
        console.log(a)
    }
    
    function sum() {
        var a = 20
        foo()
    }
    
    sum()
    /* 输出
        10
    /
    

    思考题

    var n = 10
    function fn(){
        var n =20
        function f() {
           n++;
           console.log(n)
         }
        f()
        return f
    }
    
    var x = fn()
    x()
    x()
    console.log(n)
    /* 输出
    *  21
        22
        23
        10
    /
    
    • 关于如何查找上级作用域

    JS 堆栈内存释放

    • 堆内存:存储引用类型值,对象类型就是键值对,函数就是代码字符串。

    • 堆内存释放:将引用类型的空间地址变量赋值成 null,或没有变量占用堆内存了浏览器就会释放掉这个地址

    • 栈内存:提供代码执行的环境和存储基本类型值。

    • 栈内存释放:一般当函数执行完后函数的私有作用域就会被释放掉。

    闭包是什么

    形成闭包的原因

    var a = 0
    function foo(){
        var b =14
        function fo(){
            console.log(a, b)
        }
        fo()
    }
    foo()
    

    闭包的作用

    • 保护函数的私有变量不受外部的干扰。形成不销毁的栈内存。
    • 保存,把一些函数内的值保存下来。闭包可以实现方法和属性的私有化

    闭包经典使用场景

      1. return 回一个函数
    var n = 10
    function fn(){
        var n =20
        function f() {
           n++;
           console.log(n)
         }
        return f
    }
    
    var x = fn()
    x() // 21
    
      1. 函数作为参数
    var a = '林一一'
    function foo(){
        var a = 'foo'
        function fo(){
            console.log(a)
        }
        return fo
    }
    
    function f(p){
        var a = 'f'
        p()
    }
    f(foo())
    /* 输出
    *   foo
    / 
    
      1. IIFE(自执行函数)
    var n = '林一一';
    (function p(){
        console.log(n)
    })()
    /* 输出
    *   林一一
    / 
    
      1. 循环赋值
    for(var i = 0; i<10; i++){
      (function(j){
           setTimeout(function(){
            console.log(j)
        }, 1000) 
      })(i)
    }
    
      1. 使用回调函数就是在使用闭包
    window.name = '林一一'
    setTimeout(function timeHandler(){
      console.log(window.name);
    }, 100)
    

    使用闭包需要注意什么

    经典面试题

    • for 循环和闭包(号称必刷题)
    var data = [];
    
    for (var i = 0; i < 3; i++) {
      data[i] = function () {
        console.log(i);
      };
    }
    
    data[0]();
    data[1]();
    data[2]()
    /* 输出
        3
        3
        3
    /
    
    • 使用闭包改善上面的写法达到预期效果,写法1:自执行函数和闭包
    var data = [];
    
    for (var i = 0; i < 3; i++) {
        (function(j){
          setTimeout( data[j] = function () {
            console.log(j);
          }, 0)
        })(i)
    }
    
    data[0]();
    data[1]();
    data[2]()
    
    • 写法2:使用 let
    var data = [];
    
    for (let i = 0; i < 3; i++) {
      data[i] = function () {
        console.log(i);
      };
    }
    
    data[0]();
    data[1]();
    data[2]()
    

    参考

    深入理解JavaScript闭包之什么是闭包

    JavaScript深入之闭包


    起源地下载网 » 面试 | JS 闭包经典使用场景和含闭包必刷题

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元