<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • javascript閉包的介紹理解和講解實(shí)例

    時(shí)間:2024-07-12 21:08:58 JavaScript 我要投稿
    • 相關(guān)推薦

    javascript閉包的介紹理解和講解實(shí)例

      順便提示一下:

      詞法作用域:變量的作用域是在定義時(shí)決定而不是執(zhí)行時(shí)決定,也就是說(shuō)詞法作用域取決于源碼,通過(guò)靜態(tài)分析就能確定,因此詞法作用域也叫做靜態(tài)作用域。 with和eval除外,所以只能說(shuō)JS的作用域機(jī)制非常接近詞法作用域(Lexical scope)。

      下面是一個(gè)簡(jiǎn)單的使用全局變量的閉包實(shí)例:

      復(fù)制代碼 代碼如下:

      var sWord="Hello,Welcome to web前端開(kāi)發(fā)工程師的博客,請(qǐng)多多指教。"

      function disWord(){

      alert(sWord);

      }

      disWord();

      解析:腳本載入到內(nèi)存的時(shí)候,disWord并沒(méi)有計(jì)算sWord的值,而是函數(shù)disWord調(diào)用的時(shí)候執(zhí)行了sWord的計(jì)算。

      下面是函數(shù)中定義另一個(gè)函數(shù)的閉包實(shí)例:

      復(fù)制代碼 代碼如下:

      var iNum=10;

      function add(num1,num2){

      function doAdd(){return num1+num2+iNum;}

      return doAdd();

      }

      解析:內(nèi)部函數(shù)doAdd是個(gè)閉包,它將獲取傳入?yún)?shù)num1,num2和全局變量iNum的值,doAdd不接受參數(shù),add最后一步調(diào)用doAdd,請(qǐng)兩個(gè)參數(shù)和全局變量求和返回,可以看得出doAdd使用的值是在執(zhí)行環(huán)境中獲得的。

      下面是在網(wǎng)上找的幾個(gè)例子,理解詞法作用域和閉包

      復(fù)制代碼 代碼如下:

      、案例一

      /*全局(window)域下的一段代碼*/

      function a(i) {

      var i;

      alert(i);

      };

      a(10);

      疑問(wèn):上面的代碼會(huì)輸出什么呢?

      答案:10。

      具體執(zhí)行過(guò)程

      a 函數(shù)有一個(gè)形參 i,調(diào)用 a 函數(shù)時(shí)傳入實(shí)參 10,形參 i=10

      接著定義一個(gè)同名的局部變量 i,未賦值

      alert 輸出 10

      思考:局部變量 i 和形參 i 是同一個(gè)存儲(chǔ)空間嗎?

      、案例二

      復(fù)制代碼 代碼如下:

      1 /*全局(window)域下的一段代碼*/

      2 function a(i) {

      3 alert(i);

      4 alert(arguments[0]); //arguments[0]應(yīng)該就是形參 i

      5 var i = 2;

      6 alert(i);

      7 alert(arguments[0]);

      8 };

      9 a(10);

      疑問(wèn):上面的代碼又會(huì)輸出什么呢?

      答案:10,10,2,2

      具體執(zhí)行過(guò)程

      函數(shù)有一個(gè)形參i,調(diào)用 a 函數(shù)時(shí)傳入實(shí)參 10,形參 i=10

      第一個(gè) alert 把形參 i 的值 10 輸出

      第二個(gè) alert 把 arguments[0] 輸出,應(yīng)該也是 i

      接著定義個(gè)局部變量 i 并賦值為2,這時(shí)候局部變量 i=2

      第三個(gè) alert 就把局部變量 i 的值 2 輸出

      第四個(gè)alert再次把 argumentsa[0] 輸出

      思考:這里能說(shuō)明局部變量 i 和形參 i 的值相同嗎?

      、案例三

      復(fù)制代碼 代碼如下:

      /*全局(window)域下的一段代碼*/

      function a(i) {

      var i = i;

      alert(i);

      };

      a(10)

      疑問(wèn):上面的代碼又又會(huì)輸出什么呢?

      答案:10

      具體執(zhí)行過(guò)程

      第一句聲明一個(gè)與形參 i 同名的局部變量 i,根據(jù)結(jié)果我們知道,后一個(gè) i 是指向了

      形參 i,所以這里就等于把形參 i 的值 10 賦了局部變量 i

      第二個(gè) alert 當(dāng)然就輸出 10

      思考:結(jié)合案列二,這里基本能說(shuō)明局部變量 i 和形參 i 指向了同一個(gè)存儲(chǔ)地址!

      、案例四

      復(fù)制代碼 代碼如下:

      /*全局(window)域下的一段代碼*/

      var i=10;

      function a() {

      alert(i);

      var i = 2;

      alert(i);

      };

      a();

      疑問(wèn):上面的代碼又會(huì)輸出什么呢?

      答案:undefined, 2

      具體執(zhí)行過(guò)程

      第一個(gè)alert輸出undefined

      第二個(gè)alert輸出 2

      思考:到底怎么回事兒?

      看到上面的幾個(gè)例子,你可能會(huì)想到底是怎么執(zhí)行的呢?執(zhí)行的細(xì)節(jié)又是怎么樣的呢? JS 引擎的工作方式是怎樣的呢?

      解析過(guò)程

      、執(zhí)行順序

      編譯型語(yǔ)言,編譯步驟分為:詞法分析、語(yǔ)法分析、語(yǔ)義檢查、代碼優(yōu)化和字節(jié)生成。

      解釋型語(yǔ)言,通過(guò)詞法分析和語(yǔ)法分析得到語(yǔ)法分析樹(shù)后,就可以開(kāi)始解釋執(zhí)行了。這里是一個(gè)簡(jiǎn)單原始的關(guān)于解析過(guò)程的原理,僅作為參考,詳細(xì)的解析過(guò)程(各種JS引擎還有不同)還需要更深一步的研究

      javascript的執(zhí)行過(guò)程,如果一個(gè)文檔流中包含多個(gè)script代碼段(用script標(biāo)簽分隔的js代碼或引入的js文件),它們的運(yùn)行順序是:

      步驟1. 讀入第一個(gè)代碼段(js執(zhí)行引擎并非一行一行地執(zhí)行程序,而是一段一段地分析執(zhí)行的)

      步驟2. 做詞法分析和語(yǔ)法分析,有錯(cuò)則報(bào)語(yǔ)法錯(cuò)誤(比如括號(hào)不匹配等),并跳轉(zhuǎn)到步驟5

      步驟3. 對(duì)【var】變量和【function】定義做“預(yù)解析“(永遠(yuǎn)不會(huì)報(bào)錯(cuò)的,因?yàn)橹唤馕稣_的聲明)

      步驟4. 執(zhí)行代碼段,有錯(cuò)則報(bào)錯(cuò)(比如變量未定義)

      步驟5. 如果還有下一個(gè)代碼段,則讀入下一個(gè)代碼段,重復(fù)步驟2

      步驟6. 結(jié)束

      、特殊說(shuō)明

      全局域(window)域下所有JS代碼可以被看成是一個(gè)“匿名方法“,它會(huì)被自動(dòng)執(zhí)行,而此“匿名方法“內(nèi)的其它方法則是在被顯示調(diào)用的時(shí)候才被執(zhí)行

      、關(guān)鍵步驟

      上面的過(guò)程,我們主要是分成兩個(gè)階段

      解析:就是通過(guò)語(yǔ)法分析和預(yù)解析構(gòu)造合法的語(yǔ)法分析樹(shù)。

      執(zhí)行:執(zhí)行具體的某個(gè)function,JS引擎在執(zhí)行每個(gè)函數(shù)實(shí)例時(shí),都會(huì)創(chuàng)建一個(gè)執(zhí)行環(huán)境(ExecutionContext)和活動(dòng)對(duì)象(activeObject)(它們屬于宿主對(duì)象,與函數(shù)實(shí)例的生命周期保持一致)

      在這里有更詳細(xì)的實(shí)例分析資料:/article/24547.htm

    【javascript閉包的介紹理解和講解實(shí)例】相關(guān)文章:

    javascript閉包的定義及應(yīng)用實(shí)例分析08-25

    javascript的閉包概念怎么理解06-15

    Javascript 閉包引起IE內(nèi)存泄露分析07-05

    JavaScript的課堂講解09-03

    對(duì)javascript的理解08-08

    JavaScript fontcolor方法入門(mén)實(shí)例07-07

    JavaScript中push(),join() 函數(shù)實(shí)例詳解09-05

    理解JavaScript原型鏈教程09-02

    有關(guān)深入理解JavaScript中的并行處理的介紹10-14

    實(shí)例講解托福閱讀推斷題技巧06-20

    主站蜘蛛池模板: 香蕉国产精品频视| 欧美精品在线视频| 欧美日韩国产中文精品字幕自在自线 | 国产一级精品高清一级毛片| 9久久9久久精品| 欧美亚洲色综久久精品国产| 欧美精品亚洲精品日韩精品| 国产精品偷窥熟女精品视频| 欧美一区二区精品久久| 99久久久国产精品免费无卡顿| 亚洲AV成人精品一区二区三区| 欧美成人精品欧美一级乱黄码| www.精品| 国产高清国内精品福利99久久| 久久精品视频免费| 国产精品一久久香蕉产线看| 成人精品一区二区三区中文字幕| 精品久久久久香蕉网| 久久国产精品一国产精品金尊| 午夜不卡久久精品无码免费| 亚洲国产精品无码中文字| 最新国产精品拍自在线播放| 亚洲精品99久久久久中文字幕 | 国模精品一区二区三区| 精品视频一区二区三区免费| 国产福利91精品一区二区三区| 精品久久久久久国产潘金莲| 精品一区二区三区在线观看视频| 亚洲精品夜夜夜妓女网| 亚洲精品乱码久久久久久中文字幕| 久久久99精品成人片中文字幕 | 国产精品99久久久久久www| 柠檬福利精品视频导航| 国产精品久久久久久福利69堂| 国产成人亚洲综合无码精品| 久久亚洲中文字幕精品有坂深雪| 无码精品久久久天天影视| 亚洲AV无码久久精品色欲| 亚洲AV无码国产精品色午友在线 | 亚洲AV无码成人网站久久精品大| 亚洲伊人久久精品影院|