91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript閉包和回調詳解

發布時間:2020-09-02 03:14:32 來源:腳本之家 閱讀:154 作者:╰.yuyu.* 欄目:web開發

一、閉包

 閉包(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

示例二:

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個方法,一個是從小到大的排序,一個是從大到小的排序方法。回調個人認為就是將決定權交給了實際業務開發工程師,由他來決定怎么去處理,這種思路跟我們平常接觸的不同,有點不習慣,但是這種思路在異步編程中特別能看出它的好處,不知道我這么理解是否正確。下面示例代碼就是回調的典型使用場合:

var arr = [25,13,33,8,23,32];
Array.prototype.sort = function(callback){
 var arr = this;
 var i = 0;//i在這里定義與在for循環的括號內(for(var i = 0; i < ...))定義是一樣的
 for(; i < arr.length-1; i++){
  var j = i + 1;
  for(; j < arr.length;j++){
  if(callback(arr[i],arr[j])){
   var temp = arr[i];
   arr[i] = arr[j];
   arr[j] = temp;
  }
  } 
 }
return arr;
};
//a-b>0表示數組從小到大排序
arr.sort(function(a,b){
 return a - b > 0;
});
document.write(arr.join(",") + "<br />");//8,13,23,25,32,33
//b-a>0表示數組從大到小排序
arr.sort(function(a,b){
 return b - a > 0;
});
document.write(arr.join(","));//33,32,25,23,13,8


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

婺源县| 长兴县| 宝兴县| 潢川县| 咸宁市| 东台市| 周至县| 炎陵县| 墨江| 应用必备| 刚察县| 丽水市| 仪陇县| 交口县| 元阳县| 孝义市| 宝丰县| 边坝县| 广灵县| 牡丹江市| 鹤壁市| 宾川县| 宜宾市| 临潭县| 祁连县| 信宜市| 宾阳县| 开化县| 郁南县| 黄大仙区| 彝良县| 正安县| 十堰市| 泗水县| 聂荣县| 迭部县| 济宁市| 玉山县| 东丽区| 禹城市| 遵义县|