zoukankan      html  css  js  c++  java
  • javascript闭包与函数式编程

    一、相关概念

    1、动态程序设计语言(Dynamic Programming Language )

              Dynamic Programming Language (动态语言或动态编程语言) 动态语言,准确地说,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。比如众所周知的ECMAScript(JavaScript)便是一个动态语言。除此之外如Ruby、Python等也都属于动态语言,而C、C++等语言则不属于动态语言。

    2、 动态类型语言和静态类型语言  

             动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。

             静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。

    3、  函数式编程(  参考http://www.ruanyifeng.com/blog/2012/04/functional_programming.html)

    二、闭包

    闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。在下面的函数中print函数就是一个闭包

     1 function randomAlert()
     2 {
     3     var x=Math.random();
     4      function  print()
     5     {
     6 console.log("产生的随机数",x);
     7     }
     8     return print;
     9 }
    10 var a=randomAlert();
    11 var b=randomAlert();
    12 a();
    13 b();

       

    闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,
    另一个就是让这些变量的值始终保持在内存中。

     1 function f1(){
     2         var n=999;
     3         nAdd=function(){n+=1}
     4         function f2(){
     5         console.log(n);
     6         }
     7         return f2;
     8   }
     9   var result=f1();
    10   result(); // 999
    11   nAdd();
    12   result(); // 1000

    在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。
    为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,
    而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,
    被垃圾回收机制(garbage collection)回收。
    这段代码中另一个值得注意的地方,就是"nAdd=function(){n+=1}"这一行,
    首先在nAdd前面没有使用var关键字,因此nAdd是一个全局变量,
    而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),
    而这个匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,
    可以在函数外部对函数内部的局部变量进行操作。

    var getNam=object.getNameFunc();
    相当于function getName()
    {
    return this.name;//很明显此时this代表全局变量即Global,this.name等于"The Window"
    }

     1 var name = "The Window";
     2   var object = {
     3         name : "My Object",
     4         getNameFunc : function(){
     5               return function(){
     6                     return this.name;
     7               };
     8         }
     9   };
    10 console.log("name的值",object.getNameFunc()());

        

  • 相关阅读:
    ASP.NETLinkButton的Click事件中获取CommandArgument的值
    关于绑定了GridView控件后怎么截取字符串和CSS样式来控制表头不换行
    自动生成不重复的含有数字和字母的随机码
    ASP.NET母版页
    C#随机不重复数字字符串2
    asp.net中实现在文本框按下回车键后相当于按下tab键focus跳到下一个文本框
    ASP.NET获取<EmptyDataTemplate></EmptyDataTemplate>模板中的textBox控件值
    C#生成拼音简码
    gridview获取当前行索引的方法大集合
    一、XML
  • 原文地址:https://www.cnblogs.com/fengshuzi/p/3510304.html
Copyright © 2011-2022 走看看