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的執行效率高,缺點就是耗費內存,由於須要更多的空間來存放函數的上下文環境。