• Closure 闭包


    闭包,接触js的肯定不会陌生,学习的一番,有如下理解:

    一 .怎样理解

    百科上的解释是,闭包指的是可以访问自由变量的代码块,这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量);

    我是这么理解的,一段代码块的运行,看得见的是代码,是敲出的字符,看不见的是运行时的环境和上下文,运行时的环境本质也是一组变量,代码块运行的时候,可以调用自身定义的局部变量,还可以根据定义时得绑定访问外部定义的数据,就是闭包。不严谨的概括一下,只要访问了外部定义的数据的代码块,就是闭包!

    二.代码举例

    function fA(x){

      var temp = 2;

      return function(y){

        alert(y+x+temp);

      }  

    }

    var fB = fA(3);

    fB(4); --这就是一个闭包 ,它访问了temp,x这些不是自身定义的变量或参数,这些基本类型数据之间都是值传递

    var arg = new Number(2);

    var fB = fA(arg);

    fB(4);--当传递的变量或参数是Object,数据传递则是引用传递,对arg的任何操作都是指向最初一个对象

    js中调用延迟函数,其实不知不觉中也是在使用闭包特性,

    function replace(domId,text,time){

      setTimeout(function(){

         document.getElementById(domId).innerHTML = text; 

      },time)

    }

    三.还用什么用

      上面举例几种闭包在js中的例子,表明其实我们在不了解闭包的情况下,也经常使用闭包特性,接下来举一个不常用的例子,隐藏函数的中数据,这个搞过java的人都知道get/set这种pojo中的写法,类的属性对外隐藏,提供统一的对外访问修改的方法,用闭包也可以实现

    var pojo = (function {

      var arr = {};

      return function (key,val){

        if(val=== undefined) return arr[val];

        else{

          date[key] = val;

          return date[key];

        }

      } 

    }){};

    pojo('a');//undefined

    pojo('a',1);//set 1

    pojo('a');//get 1

    四.一些思考

      目前,不光js,在java7,C#,ruby中都加入了闭包的特性,C#中闭包通过委托来实现大写基础,随后发展出简洁优雅的lambda表达式和LINQ,是的用C#写代码莫名的感觉爽,不管存在于哪,闭包通过突破一般函数的调用限制,让我们在不知不觉中写出更优雅的代码。之前在一位博主上看到,一段这样概括闭包的话,深以为然,其实不光是闭包,一些能广泛被接收语言特性,都是和闭包一样有类似特点:

    (1)闭包是一种设计原则,它通过分析上下文,来简化用户的调用,让用户在不知晓的情况下,达到他的目的;

    (2)网上主流的对闭包剖析的文章实际上是和闭包原则反向而驰的,如果需要知道闭包细节才能用好的话,这个闭包是设计失败的;

    (3)尽量少学习。

    over。

    StayHungry 求知若渴 StayFoolish 放低姿态
  • 相关阅读:
    幂等性
    视频上墙
    java 字符串 大小写转换 、去掉首末端空格 、根据索引切割字符 、判断是否含有某连续字符串
    Java 递归 常见24道题目 总结
    Java 单引号 与 双引号 区别
    细谈 Java 匿名内部类 【分别 使用 接口 和 抽象类实现】
    细谈 == 和 equals 的具体区别 【包括equals源码分析】
    简单谈谈 数组排序 的方法 【自定义算法 、 冒泡算法 等】
    细说 栈 为什么又被称为 栈堆 ?【得从数组变量讲起】
    简单谈谈 堆、栈、队列 【不要傻傻分不清】
  • 原文地址:https://www.cnblogs.com/wujunjie/p/6633016.html
Copyright © 2020-2023  润新知