最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

通過(guò)示例徹底搞懂js閉包

 更新時(shí)間:2017年08月10日 08:04:59   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇通過(guò)示例徹底搞懂js閉包。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

例1

function sayHello(name) 
{
 var text = 'Hello ' + name;
 var sayAlert = function() { console.log(text); }
 sayAlert();
}

sayHello("Bob") // 輸出"Hello Bob"

在sayHello()函數(shù)中定義并調(diào)用了sayAlert()函數(shù);sayAlert()作為內(nèi)層函數(shù),可以訪問(wèn)外層函數(shù)sayHello()中的text變量。

例2

function sayHello2(name) 
{
 var text = 'Hello ' + name; // 局部變量
 var sayAlert = function() { console.log(text); }
 return sayAlert;
}

var say2 = sayHello2("Jane");
say2(); // 輸出"Hello Jane"

例3

function buildList(list) {
 var result = [];
 for(var i = 0; i < list.length; i++) {
  var item = 'item' + list[i];
  result.push( 
    function() {
      console.log(item + ' ' + list[i]);
    } 
   );
 }
 return result;
}

var fnlist = buildList([1,2,3]);
for (var j = 0; j < fnlist.length; j++) {
  fnlist[j](); 
}

得到的結(jié)果:連續(xù)輸出3個(gè)"item3 undefined"

解析:通過(guò)執(zhí)行buildList函數(shù),返回了一個(gè)result,那么這個(gè)result存放的是3個(gè)匿名函數(shù)。然而這三個(gè)匿名函數(shù)其實(shí)就是三個(gè)閉包,因?yàn)樗梢栽L問(wèn)到父函數(shù)的局部變量。所以閉包內(nèi)的保留的i是最終的值為3.所以list[3]肯定是undefined. item變量值為item3.

改成如下代碼:

function buildList(list) {
 var result = [];
 for(var i = 0; i < list.length; i++) {
  var item = 'item' + list[i];
  result.push( 
    (function(i) {
      console.log(item + ' ' + list[i]);
    })(i)
   );
 }
 return result;
}

var fnlist = buildList([1,2,3]);

得到的結(jié)果:

item1 1
item2 2
item3 3

解釋:這兒雖然傳遞了一個(gè)數(shù)組進(jìn)去,但是返回的是三個(gè)自執(zhí)行的函數(shù)。

例4

function newClosure(someNum, someRef) 
{
 var anArray = [1,2,3];
 var num = someNum;
 var ref = someRef;
 return function(x) 
 {
 num += x;
 anArray.push(num);
 console.log('num: ' + num + "; " + 'anArray ' + anArray.toString() + "; " + 'ref.someVar ' + ref.someVar);
 }
}
closure1 = newClosure(40, {someVar: "closure 1"}); 
closure2 = newClosure(1000, {someVar: "closure 2"}); 
closure1(5); // 打印"num: 45; anArray 1,2,3,45; ref.someVar closure 1"
closure2(-10); // 打印"num: 990; anArray 1,2,3,990; ref.someVar closure 2"

每次調(diào)用newClosure()都會(huì)創(chuàng)建獨(dú)立的閉包,它們的局部變量num與ref的值并不相同。

例5

function sayAlice() 
{
 var sayAlert = function() { console.log(alice); }
 var alice = 'Hello Alice';
 return sayAlert;
}

var sayAlice2 = sayAlice();
sayAlice2(); // 輸出"Hello Alice"

alice變量在sayAlert函數(shù)之后定義,這并未影響代碼執(zhí)行。因?yàn)榉祷睾瘮?shù)sayAlice2所指向的閉包會(huì)包含sayAlice()函數(shù)中的所有局部變量,這自然包括了alice變量,因此可以正常打印”Hello Alice”。

例6

function setupSomeGlobals() {
 var num = 666;
 gAlertNumber = function() { console.log(num); }
 gIncreaseNumber = function() { num++; }
 gSetNumber = function(x) { num = x; }
}
setupSomeGlobals();
gAlertNumber(); // 輸出666
gIncreaseNumber();
gAlertNumber(); // 輸出667
gSetNumber(5);
gAlertNumber(); // 輸出5

解釋:首先gAlertNumber,gIncreaseNumber,gSetNumber是三個(gè)全局變量,并且其三個(gè)值都是匿名函數(shù),然而這三個(gè)匿名函數(shù)本身都是閉包。他們操作的num都是保存在內(nèi)存中的同一個(gè)num,所有會(huì)得出上面的結(jié)果。

以上這篇通過(guò)示例徹底搞懂js閉包就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

罗江县| 肥东县| 荔波县| 荣昌县| 滨州市| 信丰县| 道孚县| 上林县| 齐河县| 云安县| 祁东县| 淮南市| 哈尔滨市| 张家港市| 托克托县| 宽城| 霍州市| 叶城县| 巴南区| 赤峰市| 柳州市| 盐池县| 红河县| 铁力市| 会泽县| 乌审旗| 洛宁县| 汽车| 清流县| 和政县| 皮山县| 都兰县| 乃东县| 富川| 德昌县| 土默特右旗| 乌恰县| 泰顺县| 茌平县| 咸宁市| 拉萨市|