欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

通過示例徹底搞懂js閉包

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

例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ù),可以訪問外層函數(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"

解析:通過執(zhí)行buildList函數(shù),返回了一個(gè)result,那么這個(gè)result存放的是3個(gè)匿名函數(shù)。然而這三個(gè)匿名函數(shù)其實(shí)就是三個(gè)閉包,因?yàn)樗梢栽L問到父函數(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é)果。

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

相關(guān)文章

  • JS類型判斷的四種方法詳解

    JS類型判斷的四種方法詳解

    JavaScript中有七種原始數(shù)據(jù)類型和幾種引用數(shù)據(jù)類型,本文將清楚地介紹四種用于類型判斷的方法,分別是typeOf、instanceOf、Object.prototype.toString.call()、Array.isArray(),并介紹其使用方法和判定原理,需要的朋友可以參考下
    2024-08-08
  • 老生常談JavaScript 函數(shù)表達(dá)式

    老生常談JavaScript 函數(shù)表達(dá)式

    下面小編就為大家?guī)硪黄仙U凧avaScript 函數(shù)表達(dá)式。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-09-09
  • js動(dòng)態(tài)添加onload、onresize、onscroll事件(另類方法)

    js動(dòng)態(tài)添加onload、onresize、onscroll事件(另類方法)

    window 的 onload、onresize、onscroll 事件,跟其他的事件不一樣,它不能用 attachEvent 或 addEventListener 來添加于是本人想了一些另類的方法,需要了解的朋友可以參考下
    2012-12-12
  • JS Array創(chuàng)建及concat()split()slice()的使用方法

    JS Array創(chuàng)建及concat()split()slice()的使用方法

    下面小編就為大家?guī)硪黄狫S Array創(chuàng)建及concat()split()slice()的使用方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • js處理json以及字符串的比較等常用操作

    js處理json以及字符串的比較等常用操作

    js處理json格式的插入、修改、刪除,以及字符串的比較等常用操作,下面有五個(gè)示例,感興趣的朋友可以學(xué)習(xí)下
    2013-09-09
  • JavaScript?中的行繼續(xù)符操作

    JavaScript?中的行繼續(xù)符操作

    JavaScript?中的字符串操作可能很復(fù)雜,?盡管字符串操作易于掌握,但實(shí)施起來卻具有挑戰(zhàn)性,其中一個(gè)相關(guān)領(lǐng)域是添加新行,這篇文章主要介紹了JavaScript中的行繼續(xù)符操作,需要的朋友可以參考下
    2023-06-06
  • js圖片上傳中file、bolb、base64圖片之間的相互轉(zhuǎn)化

    js圖片上傳中file、bolb、base64圖片之間的相互轉(zhuǎn)化

    這篇文章主要介紹了js圖片上傳中file、bolb、base64圖片之間的相互轉(zhuǎn)化,blob轉(zhuǎn)file,blob轉(zhuǎn)base64,base64轉(zhuǎn)file,使用canvas壓縮圖片,需要的朋友可以參考下
    2022-05-05
  • 微信小程序HTTP請求從0到1封裝

    微信小程序HTTP請求從0到1封裝

    這篇文章主要給大家介紹了關(guān)于微信小程序HTTP請求從0到1封裝的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用微信小程序具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Bootstrap學(xué)習(xí)筆記之css組件(3)

    Bootstrap學(xué)習(xí)筆記之css組件(3)

    這篇文章主要為大家詳細(xì)介紹了bootstrap學(xué)習(xí)筆記中的css組件,感興趣的小伙伴們可以參考一下
    2016-06-06
  • javascript實(shí)現(xiàn)貪吃蛇小練習(xí)

    javascript實(shí)現(xiàn)貪吃蛇小練習(xí)

    這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)貪吃蛇的小練習(xí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07

最新評論