Dynamic Programming Language (动态语言或动态编程语言) 动态语言,准确地说,是指程序在运行时能够改变其结构:新的函数能够被引进,已有的函数能够被删除等在结构上的变化。好比众所周知的ECMAScript(JavaScript)即是一个动态语言。除此以外如Ruby、Python等也都属于动态语言,而C、C++等语言则不属于动态语言。html
动态类型语言:动态类型语言是指在运行期间才去作数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其余的各类脚本语言如VBScript也多少属于动态类型语言。编程
静态类型语言:静态类型语言与动态类型语言恰好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明全部变量的数据类型,C/C++是静态类型语言的典型表明,其余的静态类型语言还有C#、JAVA等。闭包
闭包就是可以读取其余函数内部变量的函数。因为在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()());