zoukankan      html  css  js  c++  java
  • JavaScript 闭包

    JavaScript 语言的特别之处就在于:函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。

    所谓闭包就是说,一个函数能够访问其函数外部作用域中的变量,即指有权访问另一个函数作用域中的变量的函数。而创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。

    闭包的作用在于,可以通过闭包,设计私有变量及方法

    闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。

    案例一:

    function outer(a){
      var x = 1;
      function inner(y) {
        console.log(x+y);
      }
      return inner;
    }
    var  i= outer(3); //其实i内部储存的是inner函数的地址。因为outer() 返回了inner,所以其实i=inner(); 
    
    i(5); //result: 6  这里就会使用局部变量,打印出a;本层虽没有a的定义,但是在innner的作用域链存在,所以输出1
    
    outer(3)(5); //result: 6  这里是把上面两步合并了一下输出。
    
    inner(); //但是这样调用,是不能成功的,会报错。

    案例二:

    function outer(){
      var x = 1;
      function inner() {
        return x++;
      }
      return inner;
    }
    var  x= outer(); 
    
    console.log(x()); //result: 1
    console.log(x()); //result: 2
    console.log(x()); //result: 3

    为什么是1,2,3呢?因为函数的闭包,记住了定义时所在的作用域,这个作用域中的变量不是一成不变的。

    案例三:

    function outer(){
      var x = 1;
      function inner() {
        return x++;
      }
      return inner;
    }
    var  x= outer(); 
    var y = outer();
    
    console.log(x()); //result: 1
    console.log(y()); //result: 1
    console.log(x()); //result: 2
    console.log(y()); //result: 2

    这里又为什么结果是这样呢?因为 x和y其实是两个不同的对象,相互之间不影响。 每次调用一个函数,都会产生新的闭包。新的闭包,语句全新,所处环境也是全新的。

  • 相关阅读:
    CentOS7配置RAID10
    CentOS7配置RAID5笔记
    CentOS7改主机名hostname
    CentOS7设置光盘镜像为本地yum源
    VMware安装Windows Server 2008
    VMware安装CentOS7
    xss漏洞介绍
    pakichu-暴力破解
    搭建xcode9的IOS开发环境
    dvwa之xss
  • 原文地址:https://www.cnblogs.com/ningxin/p/10109077.html
Copyright © 2011-2022 走看看