一、閉包
閉包(closure)是Javascript語言的一個難點,也是它的特色,很多高級應用都要依靠閉包實現。
閉包有三個特性:
1.函數嵌套函數;
2.函數內部可以引用外部的參數和變量;
3.參數和變量不會被垃圾回收機制回收。
閉包是指有權訪問另一個函數作用域中的變量的函數,創建閉包的最常見的方式就是在一個函數內創建另一個函數,通過另一個函數訪問這個函數的局部變量。使用閉包有一個優點,也是它的缺點,就是可以把局部變量駐留在內存中,可以避免使用全局變量。全局變量在每個模塊都可調用,這勢必將是災難性的。所以推薦使用私有的,封裝的局部變量。一般函數執行完畢后,局部活動對象就被銷毀,內存中僅僅保存全局作用域。但閉包的情況不同!
示例一:
//閉包就是一個函數的返回值為另外一個函數,在outer外部可以通過這個返回的函數訪問outer內的局部變量.
function outer(){ var val = 0; return function (){ val += 1; document.write(val + "<br />"); };}var outObj = outer();outObj();//1,執行val += 1后,val還在outObj();//2outObj = null;//val 被回收var outObj1 = outer();outObj1();//1outObj1();//2閉包會使變量始終保存在內存中,如果不當使用會增大內存消耗(如果上例中定義很多outer(),則內存中會保存很多val變量)。
javascript的垃圾回收原理:
(1)、在javascript中,如果一個對象不再被引用,那么這個對象就會被GC回收;
(2)、如果兩個對象互相引用,而不再被第3者所引用,那么這兩個互相引用的對象也會被回收。
那么使用閉包有什么好處呢?使用閉包的好處是:
1.希望一個變量長期駐扎在內存中
2.避免全局變量的污染
3.私有成員的存在
二、回調
回調函數原理:我現在出發,到了通知你”。這是一個異步的流程,“我出發”這個過程中(函數執行),“你”可以去做任何事,“到了”(函數執行完畢)“通知你”(回調)進行之后的流程。
示例一:
function doSomething(callback){ callback(1,2);}function numberAdd(a,b){ document.write(a+b);}doSomething(numberAdd);//3示例二:
function Thing(name){ this.name = name;}//在Thing類里加入doSomething方法,這里使用了構造器調用模式
Thing.prototype.doSomething = function(callback){ callback(this.name);};function showName(name){ document.write(name);}var t = new Thing("zhangsan");t.doSomething(showName);//zhangsan如果你有一個數字組成的數組,你想寫個排序的公共方法,但是排序方式(從小到大或從大到小)是調用該排序方法的人決定。實現該排序方法可以用回調來實現,當然你可以寫2個方法,一個是從小到大的排序,一個是從大到小的排序方法。回調個人認為就是將決定權交給了實際業務開發工程師,由他來決定怎么去處理,這種思路跟我們平常接觸的不同,有點不習慣,但是這種思路在異步編程中特別能看出它的好處,不知道我這么理解是否正確。下面示例代碼就是回調的典型使用場合:
新聞熱點
疑難解答
圖片精選