javascript的闭包利用了javascript的做用域链和和活动对象(与C/C++这类静态语言不一样,有点相似java这种动态语言)。异步机制则是在javascript的运行机制上的编程方式。
javascript
a、活动对象:在一个函数的执行环境中(函数开辟的栈空间)用于存放函数的参数、变量、内部函数。
html
b、实例
java
function createComparisonFunction(propertyName) { return function(object1, object2){ var value1 = object1[propertyName]; var value2 = object2[propertyName]; if (value1 < value2){ return -1; } else if (value1 > value2){ return 1; } else { return 0; } }; } //建立函数 var compareNames = createComparisonFunction("name"); //调用函数 var result = compareNames({name:"Nicholas"},{name:"Greg"}); //解除对匿名函数的引用(用于释放内存) compareNames = null;
图解:当var compareNames=createComparisonFunction("name")时。编程
当调返回compareNames的时候,会造成下面的内存模型(这也是闭包的内存模型)
缓存
当compareNames=null时,匿名函数做用链才会消失。
闭包
ps:
异步
缺点:占用内存,请慎重使用。函数
优势:
测试
一、命名方便并且内存干净,不用将全部的变量挂载在window下
spa
二、没有在 <闭包函数=null>以前,会一直存在内存中。能够看成一个缓存使用。
三、模拟一个class的封装。当咱们var compareNames("name"); 的时候,咱们就像在堆中建立了一个class的对象。并且、没运行一次都会从新分配一次内存,相会之间不会影响。
c、测试
<!DOCTYPE html> <html> <head> <script> function createComparisonFunction(propertyName) { return function(object1, object2){ var value1 = object1[propertyName]; var value2 = object2[propertyName]; if (value1 < value2){ return -1; } else if (value1 > value2){ return 1; } else { return 0; } }; } //建立函数 var names = createComparisonFunction("name")({name:"Nicholas"},{name:"Greg"}); var ages = createComparisonFunction("age")({age:1},{age:3}); //调用函数 console.log(names); console.log(ages); //解除函数 names=null; ages=null; </script> </head> <body> 闭包 </body> </html>
总结:
一、javascript是单线程的,全部的任务都会按顺序执行。
二、为了在等待I/O设备的的信息时,利用CPU的运算能力。将任务分为同步任务(顺序执行),异步任务(任务放在一个任务队列中等待执行)。
ps:好比C:从main()开始,咱们都是一个函数一个函数的开辟栈,而后函数执行完成释放栈。最后释放main()栈。可是在javascript中把须要I/O等待的任务(function)直接放在了一个task queue中。当栈中的任务执行完成,栈空。就会从task queue中提取一个能够执行的任务,而后按顺序执行。知道栈和task queue上的任务都执行完。
他们大概的区别像下面这种:
a、c的运行模型
c从main()开始,一直是随调用的函数在栈里面开辟帧,关闭帧。总体上是顺序执行的,若是碰见了I/O处理的函数只有等待。
b、javascript的运行模型
javascript在C的模型基础上多了一个task queue(任务队列:存听任务链队列)。一个任务链(即执行顺序)执行成后,栈会空闲,而后从任务队列中从新取出一个可运行的任务链执行。在这其中只要含有异步方式的函数都会变成一个任务连放在任务队列中(例如 :I/O读取等待)。
可运行的任务链:读取文件完成,setTime、setInterval的时间到达。
一条任务链:如C的main()方法是任务链的开端。
javascript的这种执行方式,优势就是CPU的执行效率高,缺点就是耗费内存,由于须要更多的空间来存放函数的上下文环境。