成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析Javascript閉包的特性

開發 前端
本文將對Javascript閉包的特性進行分析,并舉例進行說明。閉包,是指語法域位于某個特定的區域,具有持續參照(讀寫)位于該區域內自身范圍之外的執行域上的非持久型變量值能力的段落。

Javascript閉包的定義非常晦澀——閉包,是指語法域位于某個特定的區域,具有持續參照(讀寫)位于該區域內自身范圍之外的執行域上的非持久型變量值能力的段落。這些外部執行域的非持久型變量神奇地保留它們在閉包最初定義(或創建)時的值(深連結)。

簡單來說,Javascript閉包就是在另一個作用域中保存了一份它從上一級函數或作用域取得的變量(鍵值對),而這些鍵值對是不會隨上一級函數的執行完成而銷毀。周愛民說得更清楚,閉包就是“屬性表”,閉包就是一個數據塊,閉包就是一個存放著“Name=Value”的對照表。就這么簡單。但是,必須強調,閉包是運行期概念,一個函數實例。

Javascript閉包的實現,通常是在函數內部再定義函數,讓該內部函數使用上一級函數的變量或全局變量。

ECMAScript認為使用全局變量是一個簡單的Javascript閉包實例。

  1. var sMessage = "Hello World";   
  2. function sayHelloWorld(){   
  3. alert(sMessage);   
  4. };   
  5. sayHelloWorld(); 

但它完成沒有體現Javascript閉包的特性……

現在比較讓人認同的Javascript閉包實現有如下三種

  1. with(obj){   
  2. //這里是對象閉包   
  3. }(function(){      
  4. //函數閉包   
  5. })()try{   
  6. //...   
  7. catch(e) {   
  8. //catch閉包 但IE里不行   

附上今天在無憂看到的問題:

要求:

讓這三個節點的Onclick事件都能正確的彈出相應的參數。

  1. <ul>    
  2. <li id="a1">aa</li>    
  3. <li id="a2">aa</li>   
  4. <li id="a3">aa</li>   
  5. </ul>   
  6. <script type="text/javascript">   
  7. <ul>   
  8. <li id="a1">aa</li>   
  9. <li id="a2">aa</li>   
  10. <li id="a3">aa</li>   
  11. </ul>   
  12. <script type="text/javascript">   
  13. for(var i=1; i < 4; i++){   
  14. var id = document.getElementById("a" + i);   
  15. id.onclick = function(){   
  16. alert(i);//現在都是返回4      
  17. }   
  18. }   
  19. </script> 

客服果果的解答:

  1. for(var i=1; i < 4; i++){      
  2. var id = document.getElementById("a" + i);     
  3. /*     
  4. 這里生成了一個匿名函數并賦值給對象 id_i;     
  5. */     
  6. id.onclick = function(){          
  7. /*          
  8. 這個i來源于局部變量,無法以window.i或者obj.i的形式在后期引用,          
  9. 只好以指針或者變量地址方式保存在這個匿名函數中,          
  10. 這就是傳說的閉包,所以所有這個過程中生成的事件句柄都使用引用          
  11. 的方式來持久這個變量,也就是這些匿名函數共用一個變量i;          
  12. */         
  13. alert(i);      
  14. };   
  15. }; 

局部變全局

  1. for(var i=1; i < 4; i++){   
  2. var id = document.getElementById("a" + i);     
  3. id.i=i;//這個i有了根     
  4. id.onclick=function(){          
  5. alert(this.i)      
  6. };   
  7. };1.for(var i=1; i < 4; i++){     
  8. var id = document.getElementById("a" + i);    
  9. window[id.id]=i;//這個i有了根    
  10. id.onclick=function(){         
  11. alert(window[this.id]);     
  12. };   

產生一對一的更多Javascript閉包

  1. for(var i=1; i < 4; i++){    
  2. var id = document.getElementById("a" + i);    
  3. id.onclick = new function(){        
  4. var i2=i;//這個i是閉包的閉包       
  5. return function(){           
  6. alert(i2);       
  7. }     
  8. };   

【編輯推薦】

  1. JavaScript類和繼承:prototype屬性
  2. JavaScript類和繼承:this屬性
  3. ExtJS Grid Tooltip的3+1種實現方式總結
  4. JavaScript異步調用框架的鏈式實現
  5. JavaScript異步調用框架的jQuery風格鏈式調用
責任編輯:彭凡 來源: cnblogs
相關推薦

2011-03-02 12:33:00

JavaScript

2021-02-21 16:21:19

JavaScript閉包前端

2016-09-14 09:20:05

JavaScript閉包Web

2020-10-14 15:15:28

JavaScript(

2011-05-25 14:48:33

Javascript閉包

2012-11-29 10:09:23

Javascript閉包

2010-06-23 10:24:42

Javascript閉

2016-09-18 20:53:16

JavaScript閉包前端

2017-09-14 13:55:57

JavaScript

2011-05-12 18:26:08

Javascript作用域

2017-05-22 16:08:30

前端開發javascript閉包

2021-01-13 11:25:12

JavaScript閉包函數

2009-03-17 15:36:29

JavaScript循環事件

2021-12-06 07:15:48

Javascript作用域閉包

2009-10-26 09:41:26

PHP5.3閉包特性

2010-06-17 10:22:47

PHP

2024-01-22 09:51:32

Swift閉包表達式尾隨閉包

2011-05-30 14:41:09

Javascript閉

2023-10-26 07:47:35

JavaScript代碼變量

2020-02-12 16:58:15

JavaScript前端技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 涩爱av一区二区三区 | 在线视频91 | 韩国av一区二区 | 久久99精品视频 | 久久久久国产精品 | 欧美h版 | 日韩中文字幕在线视频观看 | 国产一区二区在线播放 | 国产成人午夜电影网 | 伊人久久麻豆 | 国产一区二区电影 | 亚洲一区二区三区四区在线观看 | 91在线免费视频 | 国产传媒在线观看 | 国产一区二区麻豆 | 日本特黄a级高清免费大片 特黄色一级毛片 | 久久久久久91 | 亚洲精品一区二区冲田杏梨 | 四虎影院美女 | 欧美综合一区 | 国产高清在线观看 | 中文字幕精品一区二区三区精品 | 黄色在线网站 | 日本欧美在线视频 | 中文字幕国产精品 | 日韩另类| 91视频中文 | 国产精品一区二区免费 | 日韩欧美中文 | av网站在线播放 | 国产一区二区免费 | 欧美成人免费 | 中文字幕免费在线 | 久草青青 | 欧美精品一区二区三区在线播放 | 亚洲va国产日韩欧美精品色婷婷 | 久久精品免费观看 | 欧美黄视频 | 日本激情视频中文字幕 | 国产免费一区二区 | 久久久久se |