• javascript-原生-闭包


    1.变量的作用域

    前提:这里只全部都通过var创建的变量或对象

    1.全局变量:函数外创建变量

      var x=10;
     function test(){
      alert(
    "全局变量在test函数中"+x);
     function a(){
       alert("全局变量在私有函数中"+x); 
     }
      a();
    }

    2.局部变量:函数内部创建变量。

     

    var x=10;
    function test(){
      var y=20;
      alert("全局变量在test函数中"+x);//10
      alert("局部变量在test函数中"+y);//20
      alert("局部变量在test函数中"+z);//报错,z未定义
      function a(){
        var z=30;
        alert("局部变量早函数a中"+z);//30
      }
    }
    注:x书全部变量在整个作用域有效
      y是局部变量在test函数中有效,在a函数外无效
      z是局部变量只在a函数中有效
    但是:如果我们想在函数外使用函数的变量怎么办?
    这时候就产生了一个东西,闭包。

    闭包的概念:是指有权访问另一个函数作用域中的变量的函数。

    创建闭包的方式,就是在一个函数内部创建另一个内部(私有)函数。

    下面是闭包的实例:

    1.

    function test(){
      var x=10;
      return function(){
        return x;
      }
    }
    alert(x);//调用局部变量x,报错未定义
    //调用
    var a=test();
      alert(a());
    说明:a实际上就是闭包匿名函数,函数test中的局部变量x一直保存在内存中,并没有在test调用后被自动清除。

    2.

    var y;
    function test(){
      var x=10;
      y=function(){
        return x;
      }
    }
    //调用函数
    test();//undefined
    //调用
    alert(y());//10

    3.

    function test(arg){
      var y=function(){
        return arg;
      }
      arg++;
      return y;
    }
    var a=test(123);//undefined
    alert(a());//124

    4.

    function test(){
      var x=[];
      var i;
      for(i=0;i<3;i++){
        x[i]=function(){
          return i;
        }
      }
      return x;
    }
    var a=test();//undefined
    alert(a[0]());//3
    alert(a[1]());//3
    alert(a[2]());//3
    说明:输出结果都是3,因为循环完毕i的值为3,三个函数都是指向这一个共同的值,
    那么如何解决这个问题呢?下面我们来看。

    解决方案一:使用自调函数来实现

    function test(){
      var x=[];
      var i;
      for(i=0;i<3;i++){
        x[i]=(function(a){
          return function(){
            return a;
          }
        })(i);
      }
      return x;
    }
    var a=test();//undefined
    alert(a[0]());//0
    alert(a[1]());//1
    alert(a[2]());//2

    方案二:不使用自调函数来实现

    function test(){
        function makeClosure(x){
        return function(){
          return x;
        }
      }
      var a=[];
      var i;
      for(i=0;i<3;i++){
        a[i]=makeClosure(i);
      }
      return a; }
    var b=test();//undefined
    alert(b[0]());//0
    alert(b[1]());//1
    alert(b[2]());//2

    闭包应用实例--Getter与Setter

    var getValue,setValue;
    (function(){
      var secret=0;
      getValue=function(){
        return secret;
      };
      setValue=function(v){
        secret=v;
      }
    })()
    alert(getValue())//查看内部变量值
    setValue(3)//设置内部局部变量的值
    alert(getValue());

      迭代器实例

    function setup(x){
      var i=0;
      return function(){
        return x[i++];
      }
    }
    var next=setup(["a","b","c"]);//undefined
    alert(next());//a
    alert(next());//b
    alert(next());//c
  • 相关阅读:
    关于MAC下重置MYSQL密码
    MAC下配置PHPStorm环境
    Java中从控制台输入数据的几种常用方法
    IDEA 指定入口class
    Python中的除法
    Python 学习笔记
    SQLiteDatabase中query、insert、update、delete方法参数说明
    listview与sqlite数据绑定
    java中HashMap详解
    只要有信心,人永远不会挫败
  • 原文地址:https://www.cnblogs.com/yaxinwang/p/6406900.html
Copyright © 2020-2023  润新知