JS闭包

作者: RadishHuang | 来源:发表于2021-07-01 14:12 被阅读0次

    函数存在函数环境和函数的作用域。函数打个比喻就像是一座城市,如果有人在住在城市,那城市就是存在的。如果没有住,那城市会被销毁。城市就是函数的环境,城市里面有公园,学校等之类的。学校就是上课的作用范围,我们规定了上课的作用域就在学校。

    function city() {
      var park = {
        green: '草地'
      }
      var school = {
        work: '上课'
      }
    }
    

    拿代码说。就是有一个函数(city),现在没人去用它,所以它是被销毁的。函数里面有变量park,park和school的作用域就是在city里面。然后school的work的作用域,也是在school里面。

    function city() {
      var park = {
        green: '草地'
      }
      var school = {
        work: '上课'
      }
    }
    city();
    city();
    let a = city();
    

    这边调用了两次的city的方法,按照上面的逻辑,如果没人用city的函数,那么city是被销毁的。现在用了city(); 那么会被内存创建出来,执行完毕后,又会被销毁。不管执行N次city的方法,只要外面没人引用,就会被销毁。最后一个有a引用它。所以,这个city的内存地址是不会被销毁的。当然,这个内存地址和前两个是完全不一样的,都是独立的内存地址。

    
    
    function city() {
      var name = null;
      var park = {
        green: '草地'
      }
      var school = {
        work: '上课'
      }
      return function shanghai() {
        if (name) {
          console.log('存在了');
        } else {
          name = '上海';
        }
      }
    }
    
    city()();
    city()();
    
    let a = city();
    a();
    a();
    
    

    从上面的代码来理解。前面两个city()创建出来后,因为没有人引用它。所以它执行完毕后悔被销毁。下面有a引用了,所以当前shanghai这个方法和作用域下的变量都会被保存在内存里面,不会被销毁。所以在第二次a();的时候,就会log名字我们已经被赋值了。那么上面的情况就称作闭包。

    一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域

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

    相关文章

      网友评论

          本文标题:JS闭包

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