欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

JavaScript閉包和回調(diào)詳解

一、閉包

成都創(chuàng)新互聯(lián)公司是一家專(zhuān)注于網(wǎng)站制作、做網(wǎng)站與策劃設(shè)計(jì),長(zhǎng)陽(yáng)網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:長(zhǎng)陽(yáng)等地區(qū)。長(zhǎng)陽(yáng)做網(wǎng)站價(jià)格咨詢(xún):13518219792

 閉包(closure)是Javascript語(yǔ)言的一個(gè)難點(diǎn),也是它的特色,很多高級(jí)應(yīng)用都要依靠閉包實(shí)現(xiàn)。

閉包有三個(gè)特性:

1.函數(shù)嵌套函數(shù);

2.函數(shù)內(nèi)部可以引用外部的參數(shù)和變量;

3.參數(shù)和變量不會(huì)被垃圾回收機(jī)制回收。

 閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù),創(chuàng)建閉包的最常見(jiàn)的方式就是在一個(gè)函數(shù)內(nèi)創(chuàng)建另一個(gè)函數(shù),通過(guò)另一個(gè)函數(shù)訪問(wèn)這個(gè)函數(shù)的局部變量。使用閉包有一個(gè)優(yōu)點(diǎn),也是它的缺點(diǎn),就是可以把局部變量駐留在內(nèi)存中,可以避免使用全局變量。全局變量在每個(gè)模塊都可調(diào)用,這勢(shì)必將是災(zāi)難性的。所以推薦使用私有的,封裝的局部變量。一般函數(shù)執(zhí)行完畢后,局部活動(dòng)對(duì)象就被銷(xiāo)毀,內(nèi)存中僅僅保存全局作用域。但閉包的情況不同!

 示例一:

//閉包就是一個(gè)函數(shù)的返回值為另外一個(gè)函數(shù),在outer外部可以通過(guò)這個(gè)返回的函數(shù)訪問(wèn)outer內(nèi)的局部變量.

function outer(){
 var val = 0;
 return function (){
  val += 1;
  document.write(val + "<br />");
 };
}
var outObj = outer();
outObj();//1,執(zhí)行val += 1后,val還在
outObj();//2
outObj = null;//val 被回收
var outObj1 = outer();
outObj1();//1
outObj1();//2

閉包會(huì)使變量始終保存在內(nèi)存中,如果不當(dāng)使用會(huì)增大內(nèi)存消耗(如果上例中定義很多outer(),則內(nèi)存中會(huì)保存很多val變量)。

javascript的垃圾回收原理:

 (1)、在javascript中,如果一個(gè)對(duì)象不再被引用,那么這個(gè)對(duì)象就會(huì)被GC回收;

 (2)、如果兩個(gè)對(duì)象互相引用,而不再被第3者所引用,那么這兩個(gè)互相引用的對(duì)象也會(huì)被回收。

 那么使用閉包有什么好處呢?使用閉包的好處是:

1.希望一個(gè)變量長(zhǎng)期駐扎在內(nèi)存中

2.避免全局變量的污染

3.私有成員的存在

二、回調(diào)

 回調(diào)函數(shù)原理:我現(xiàn)在出發(fā),到了通知你”。這是一個(gè)異步的流程,“我出發(fā)”這個(gè)過(guò)程中(函數(shù)執(zhí)行),“你”可以去做任何事,“到了”(函數(shù)執(zhí)行完畢)“通知你”(回調(diào))進(jìn)行之后的流程。

 示例一:

function doSomething(callback){
 callback(1,2);
}
function numberAdd(a,b){
 document.write(a+b);
}
doSomething(numberAdd);//3

示例二:

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

//在Thing類(lèi)里加入doSomething方法,這里使用了構(gòu)造器調(diào)用模式

Thing.prototype.doSomething = function(callback){
 callback(this.name);
};
function showName(name){
 document.write(name);
}
var t = new Thing("zhangsan");
t.doSomething(showName);//zhangsan

如果你有一個(gè)數(shù)字組成的數(shù)組,你想寫(xiě)個(gè)排序的公共方法,但是排序方式(從小到大或從大到小)是調(diào)用該排序方法的人決定。實(shí)現(xiàn)該排序方法可以用回調(diào)來(lái)實(shí)現(xiàn),當(dāng)然你可以寫(xiě)2個(gè)方法,一個(gè)是從小到大的排序,一個(gè)是從大到小的排序方法。回調(diào)個(gè)人認(rèn)為就是將決定權(quán)交給了實(shí)際業(yè)務(wù)開(kāi)發(fā)工程師,由他來(lái)決定怎么去處理,這種思路跟我們平常接觸的不同,有點(diǎn)不習(xí)慣,但是這種思路在異步編程中特別能看出它的好處,不知道我這么理解是否正確。下面示例代碼就是回調(diào)的典型使用場(chǎng)合:

var arr = [25,13,33,8,23,32];
Array.prototype.sort = function(callback){
 var arr = this;
 var i = 0;//i在這里定義與在for循環(huán)的括號(hào)內(nèi)(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表示數(shù)組從小到大排序
arr.sort(function(a,b){
 return a - b > 0;
});
document.write(arr.join(",") + "<br />");//8,13,23,25,32,33
//b-a>0表示數(shù)組從大到小排序
arr.sort(function(a,b){
 return b - a > 0;
});
document.write(arr.join(","));//33,32,25,23,13,8


分享文章:JavaScript閉包和回調(diào)詳解
地址分享:http://www.chinadenli.net/article38/gocdpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版品牌網(wǎng)站設(shè)計(jì)網(wǎng)站制作軟件開(kāi)發(fā)全網(wǎng)營(yíng)銷(xiāo)推廣網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)