首頁 >web前端 >js教程 >JavaScript中閉包與回呼的實例講解

JavaScript中閉包與回呼的實例講解

黄舟
黄舟原創
2017-08-10 10:39:121198瀏覽

本文主要解釋了js閉包和回調,閉包的概念和特性,結合實例分析了使用步驟與方法

一、閉包

 閉包(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();//2
outObj = null;//val 被回收
var outObj1 = outer();
outObj1();//1
outObj1();//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

//在Thing類別裡加入doSomething方法,這裡使用了建構器呼叫模式


function Thing(name){
  this.name = name;
}

如果你有一個數字組成的數組,你會想寫一個排序的公共方法,但是排序方式(從小到大或從大到小)是呼叫該排序方法的人決定。的排序,一個是從大到小的排序方法。但這種想法在非同步程式設計中特別能看出它的好處,不知道我這麼理解是否正確。

以上是JavaScript中閉包與回呼的實例講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn