<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    當柳上原的風吹向天際的時候...

    真正的快樂來源于創造

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks

    #



    全部代碼:
    http://www.tkk7.com/Files/heyang/listTable20090824145831.rar

    posted @ 2009-08-24 15:04 何楊 閱讀(130) | 評論 (0)編輯 收藏

    閉包是JavaScript的復雜特性之一,搞清楚它有益于JS復雜程序的編寫和排錯。什么是閉包呢?讓我們先看看《jQuery基礎教程》一書中對閉包的描述:

    “當內部函數在定義它的作用于的外部被引用時,就創建了該內部函數的一個閉包。在這種情況下,我們稱布什內部函數局部變量的變量為自由變量,稱外部函數的調用環境為封閉閉包的環境。從本質上講,如果內部函數引用了位于外部函數中的變量,相當于授權該變量能夠被延遲使用。因此,當外部函數調用完成后,這些變量的內存不會被釋放,因為閉包仍然需要使用它們。”

    這段話解釋得很清楚了。如果再簡短一些,用我自己的話說,閉包=封閉+打包,它的作用是將內部函數及其使用到的外部變量(內部函數的作用環境)封閉在一起打包使用。具體過程請看下面的程序:
    <SCRIPT LANGUAGE="JavaScript">
    <!--
        
    // 定義兩個引用
        var pointer1;
        
    var pointer2;

        
    // 外部函數定義
        function outer(){
            
    // 外部函數的局部變量
            var i=0;

            
    // 在外部函數內部定義的內部函數,使用了外部函數的局部變量i
            function inner(){
                alert(i);
                i
    ++;
            }

            
    // 將兩個引用指向內部函數inner
            pointer1=inner;
            pointer2
    =inner;
        }

        outer();
        alert(
    "通過引用調用內部函數開始");
        pointer1();
    // 彈出0
        pointer1();// 彈出1
        pointer2();// 彈出2
        pointer2();// 彈出3

        
    //-->
    </SCRIPT>

    執行以上程序,很容易就發覺,內部函數inner和外部函數定義的局部變量i被封閉并打包在一起了,就是閉包。這種方式和Java中向匿名類傳遞參數需要用final指定外部變量的做法異曲同工,都是改變局部變量的生存周期和作用范圍以配合特定函數的使用而已,不同的是Java在明JS在暗。

    如果創建了內部函數的多個副本,那么被打包的外部函數中的變量也會產生互不影響的多個副本,從下面的程序可以清晰的看出來:
    <SCRIPT LANGUAGE="JavaScript">
    <!--
        
    // 定義兩個引用
        var pointer1;
        
    var pointer2;

        
    // 外部函數定義
        function outer(){
            
    // 外部函數的局部變量
            var i=0;

            
    // 在外部函數內部定義的內部函數,使用了外部函數的局部變量i
            function inner(){
                alert(i);
                i
    ++;
            }

            
    // 返回內部函數的引用
            return inner;
        }

        
    // 將引用指向內部函數
        pointer1=outer();
        pointer2
    =outer();

        alert(
    "通過引用調用內部函數開始");

        pointer1();
    // 彈出0
        pointer1();// 彈出1

        pointer2();
    // 彈出0
        pointer2();// 彈出1

        
    //-->
    </SCRIPT>

    明顯,pointe1和pointer2指向的是inner的兩個副本,它們各自有不同的閉包環境,因此使用到的i也是從屬于各自閉包環境的兩個不同變量,它們地址,值都各不相同,相同的只有名字而已,就好像兩個一般函數中都有變量i一樣。

    以上程序的完整代碼請見:http://www.tkk7.com/Files/heyang/closure20090823214249.rar

    JS閉包的這個特性對動態創建的程序特別有效,如下圖中“刪除”按鈕的創建,就會用到閉包。


    請看代碼:
        // deleteImgCell
        var deleteBtn=document.createElement("input");
        deleteBtn.setAttribute(
    "type","button");
        deleteBtn.setAttribute(
    "value","刪除");
        deleteBtn.onclick
    =function(){deleteRow(code);};// 這里用到了閉包
        
    var deleteBtnCell=document.createElement("td");
        deleteBtnCell.appendChild(deleteBtn);

    deleteBtn.onclick=function(){deleteRow(code);};這句代碼為什么一定要用一個函數體包容一下呢?我們知道deleteRow這個函數的作用是刪除掉一個表格行,傳入的參數是行的id,而每行的id是不同的,程序中的id值來自于局部變量code,我們不希望它創建完按鈕后值發生變化而是希望它運行時的值和每個按鈕的點擊相應函數綁定在一起,用JS的閉包正好完成了這一點。

    以上代碼的完整程序請見:http://www.tkk7.com/Files/heyang/StockTable.rar

    http://www.tkk7.com/heyang/archive/2009/08/21/292106.html 中的程序里也使用到了閉包,以下的程序:
        window.onload=function(){

            
    var menubar=$("menubar");

            
    for(var i=0;i<menubar.childNodes.length;i++){
                
    new function(){// 這里使用了閉包,將局部變量和事件響應函數打包封閉在了一起.
                    
    var li=menubar.childNodes[i];
                    
    var subul=li.childNodes[2];

                    li.attachEvent('onmouseover',
                        
    function(){
                            subul.style.display
    ="block";
                        }
                    );
                    li.attachEvent('onmouseout',
                        
    function(){
                            subul.style.display
    ="none";
                        }
                    );
                }
            }
        }

    當然,不要紅字部分的function也是一種閉包,只是打包封閉的環境錯誤了而已.

    以上代碼的完整程序請見:http://www.tkk7.com/Files/heyang/JSCSSPopupmenu20090821151741.rar


    posted @ 2009-08-23 21:24 何楊 閱讀(944) | 評論 (0)編輯 收藏

         摘要: 程序員如果沒有美工的幫助只能在網上找些現成的圖片來用,比較費事。我閑逛時偶遇一圖片做菜單背景不錯,于是作了兩個菜單,看起來比單色的還是漂亮不少。  閱讀全文
    posted @ 2009-08-23 11:33 何楊 閱讀(927) | 評論 (0)編輯 收藏

         摘要: FormChecker是我在原來的表單驗證器的基礎上改進的類化版本,比原來的結構要好些,使用上方便些。  閱讀全文
    posted @ 2009-08-23 10:39 何楊 閱讀(531) | 評論 (0)編輯 收藏

         摘要: 更新了以前制作的JS類MyTable,有清除所所有行,取得行數,添加行,刪除行和更新背景色等類函數,并增加了創建文本單元格和創建鏈接單元格這兩個輔助函數。  閱讀全文
    posted @ 2009-08-22 21:54 何楊 閱讀(342) | 評論 (0)編輯 收藏

         摘要: 一個使用CSS定義表格的例子,寫出來以備后用。  閱讀全文
    posted @ 2009-08-22 20:40 何楊 閱讀(893) | 評論 (4)編輯 收藏

         摘要: JS+CSS彈出式二級菜單的改進版,這次目的是將樣式,內容和行為完全的分離。  閱讀全文
    posted @ 2009-08-21 15:15 何楊 閱讀(691) | 評論 (0)編輯 收藏

         摘要: CSS+JavaScript彈出式二級菜單示例,很簡單。  閱讀全文
    posted @ 2009-08-21 13:49 何楊 閱讀(367) | 評論 (0)編輯 收藏

         摘要: 本例將藍色緞帶標題欄和內容欄混合在一起。  閱讀全文
    posted @ 2009-08-15 09:34 何楊 閱讀(771) | 評論 (0)編輯 收藏

         摘要: 一個漂亮的標題欄能給人愉悅的感受,是時候告別單色或單圖片標題欄了。  閱讀全文
    posted @ 2009-08-15 09:15 何楊 閱讀(1173) | 評論 (1)編輯 收藏

    僅列出標題
    共28頁: First 上一頁 20 21 22 23 24 25 26 27 28 下一頁 
    主站蜘蛛池模板: 亚洲AV无码一区二区乱子伦| 免费h黄肉动漫在线观看| 亚洲精品午夜国产VA久久成人| 国产亚洲综合久久| 亚洲AⅤ无码一区二区三区在线| 小日子的在线观看免费| 曰韩亚洲av人人夜夜澡人人爽| 国产日韩精品无码区免费专区国产 | 中国毛片免费观看| 亚洲人成网77777色在线播放| 99在线热播精品免费99热| 久久久久久亚洲精品中文字幕 | 免费看又爽又黄禁片视频1000| 亚洲av午夜国产精品无码中文字| 国产精品jizz在线观看免费| 精品国产亚洲一区二区三区在线观看 | 美女视频黄频a免费大全视频| 亚洲欧洲精品成人久久曰影片| 久久国产精品免费一区| 亚洲国产精品无码专区| 18禁无遮挡无码国产免费网站| 亚洲国产av一区二区三区丶| 免费无码黄动漫在线观看| 无遮挡免费一区二区三区| 亚洲精品无码av人在线观看| 日韩精品免费一级视频| 亚洲色在线无码国产精品不卡| 亚洲AV无码一区二三区| 99精品视频在线观看免费| 久久精品国产亚洲AV嫖农村妇女| 成人a免费α片在线视频网站| 亚洲精品乱码久久久久久蜜桃不卡| 国产午夜免费高清久久影院| 亚洲中文字幕AV在天堂| 亚洲高清免费视频| 51在线视频免费观看视频| 欧美色欧美亚洲另类二区| 久久久久亚洲Av片无码v| 成人永久免费高清| 嫩草成人永久免费观看| 亚洲AV无码一区二区三区网址|