javascript闭包与函数式编程

1、相关概念

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

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

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

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

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

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

 

2、闭包

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

 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()());
相关文章
相关标签/搜索