中文字幕二区_国产精品免费在线观看_黄色网站观看_人人草人人澡_日本真实娇小xxxx

您的位置: 首頁 > 技術(shù)文檔 > 網(wǎng)頁制作 > 面向?qū)ο蟮?Javascript
JavaScript 的事件冒泡 demo  回到列表 現(xiàn)代 javscript 編程
 面向?qū)ο蟮?Javascript

作者:mozart0 時(shí)間: 2007-04-09 文檔類型:翻譯 來自:藍(lán)色理想

第 1 頁 摘要
第 2 頁 語言特性:引用
第 3 頁 語言特性:函數(shù)重載和類型檢查
第 4 頁 語言特性:作用域
第 5 頁 語言特性:閉包
第 6 頁 語言特性:上下文
第 7 頁 面向?qū)ο蠡A(chǔ)

  閉包

  閉包意味著內(nèi)層的函數(shù)可以引用存在于包繞它的函數(shù)的變量,即使外層的函數(shù)的執(zhí)行已經(jīng)終止。這一特殊的論題可能是非常強(qiáng)大又非常復(fù)雜的。我強(qiáng)烈推薦你們參考本節(jié)后面將提及的站點(diǎn),因?yàn)樗幸恍╆P(guān)于閉包這一話題的精彩的信息。
  我們先來看程序2-13所示的閉包的兩個(gè)簡單例子。
  
  程序2-13. 閉包改善的代碼清晰性的兩例

//得到id為"main"的元素
var obj = document.getElementById("main");

//改變它的邊框樣式
obj.style.border = "1px solid red";

//初始化一個(gè)1秒鐘以后被調(diào)用的回調(diào)函數(shù)
setTimeout(function(){
    //此函數(shù)將隱藏該元素
    obj.style.display = 'none';
}, 1000);

//用來延遲顯示消息的通用函數(shù)
function delayedAlert( msg, time ) {
    //初始化一個(gè)被封套的函數(shù)
    setTimeout(function(){
        //此函數(shù)使用了來自封套它的函數(shù)的變量msg
        alert( msg );
    }, time );
}

//調(diào)用函數(shù)delayedAlert,帶兩個(gè)參數(shù)
delayedAlert( "Welcome!", 2000 );

  第一個(gè)對setTimeout的函數(shù)調(diào)用,展示了一個(gè)的JavaScript新手遇到問題的通俗的例子。在JavaScript新手的程序里像這樣的代碼時(shí)?梢钥吹剑

setTimeout("otherFunction()", 1000);

//或者甚至
setTimeout("otherFunction(" + num + "," + num2 + ")", 1000);

  使用閉包的概念,完全可能的把這種混亂的代碼清理掉。第一個(gè)例子很簡單;有一個(gè)回調(diào)函數(shù)在調(diào)用setTimeout函數(shù)以后1000微秒以后被調(diào)用,而它仍引用了變量obj(定義在全局范圍,指向id為"main"的元素)。定義的第二個(gè)函數(shù),delayedAlert,展示了一種解決出現(xiàn)的setTimeout混亂的方案,以及函數(shù)作用域內(nèi)可以有閉包的能力。
  你們應(yīng)該可以發(fā)現(xiàn),當(dāng)在代碼中使用這種簡單的閉包時(shí),你所寫的東西的清晰性將會提高,免于陷入語法的迷霧之中。
  我們來看一個(gè)閉包可能帶來的有有趣的副作用。在某些函數(shù)化的編程語言里,有一個(gè)叫做currying的概念。本質(zhì)上講,currying是就是為函數(shù)的一些參數(shù)預(yù)填入值,創(chuàng)建一個(gè)更簡單的新函數(shù)的方法。代碼2-14里有一個(gè)簡單的currying的例子,創(chuàng)建了向另一個(gè)函數(shù)預(yù)填一個(gè)參數(shù)而得的新函數(shù)。

  代碼2-14. 使用閉包的函數(shù)currying

//生成做加法的新函數(shù)的函數(shù)
function addGenerator( num ) {
    //返回一個(gè)簡單函數(shù)用來計(jì)算兩個(gè)數(shù)的加法,
    //其中第一個(gè)數(shù)字從生成器中借用
    return function( toAdd ) {
        return num + toAdd
    };
}

//addFive現(xiàn)在是接受一個(gè)參數(shù)的函數(shù),
//此函數(shù)將給參數(shù)加5,返回結(jié)果數(shù)字
var addFive = addGenerator( 5 );

//這里我們可以看到,當(dāng)傳給它參數(shù)4的時(shí)候
//函數(shù)addFive的結(jié)果為9
alert( addFive( 4 ) == 9 );

  閉包還能解決另一個(gè)常見的JavaScript編碼方面的問題。JavaScript新手趨向于在全局作用域里放置許多變量。這一般被認(rèn)為是不好的習(xí)慣,因?yàn)槟切┳兞靠赡芮那牡赜绊懫渌膸,?dǎo)致令人迷惑的問題的產(chǎn)生。使用一個(gè)自執(zhí)行的、匿名的函數(shù),你可以從根本上隱藏所有的通常的全局變量,使它們對其它代碼不可見,如程序2-15所示。
  
  代碼2-15. 使用匿名函數(shù)從全局作用域隱藏變量的例子

//創(chuàng)建一個(gè)用作包裝的匿名函數(shù)
(function(){
    //這個(gè)變量通常情況下應(yīng)該是全局的
    var msg = "Thanks for visiting!";

    //為全局對象綁定新的函數(shù)
    window.onunload = function(){
        //使用了“隱藏”的變量
        alert( msg );
    };

//關(guān)閉匿名函數(shù)并執(zhí)行之
})();

  最后,讓我們來看使用閉包時(shí)出現(xiàn)的一個(gè)問題。閉包允許你引用存在于父級函數(shù)中的變量。然而,它并不是提供該變量創(chuàng)建時(shí)的值;它提供的是父級函數(shù)中該變量最后的值。你會看到這個(gè)問題最通常是在一個(gè)for循環(huán)中。有一個(gè)變量被用作迭代器(比如i),在for內(nèi)部新的函數(shù)被創(chuàng)建,并使用了閉包來引用該迭代器。問題是,當(dāng)新的閉包函數(shù)被調(diào)用時(shí),它們將會引用該iterator最后的值(比如,一個(gè)數(shù)組的最后位置),而不是你所期望的那個(gè)。程序2-16的例子說明,使用匿名函數(shù)激發(fā)作用域,在其中創(chuàng)建一個(gè)合乎期望的閉包是可能的。

  程序2-16. 使用匿名函數(shù)激發(fā)一個(gè)創(chuàng)建多個(gè)閉包函數(shù)所需的作用域的例子

//id為"main"的一個(gè)元素
var obj = document.getElementById("main");

//用來綁定的items數(shù)組
var items = [ "click", "keypress" ];

//遍歷items中的每一項(xiàng)
for ( var i = 0; i < items.length; i++ ) {
    //用自執(zhí)行的匿名函數(shù)來激發(fā)作用域
    (function(){
        //在些作用域內(nèi)存儲值
        var item = items[i];
        //為obj元素綁定函數(shù)
        obj[ "on" + item ] = function() {
            //item引用一個(gè)父級的變量,
            //該變量在此for循環(huán)的上文中已被成功地scoped(?)
            alert( "Thanks for your " + item );
        };
    })();
}

  閉包的概念并非輕易可以掌握的;我著實(shí)花了大量的時(shí)間和精力才徹底弄清閉包有多么強(qiáng)大。幸運(yùn)的是,有一個(gè)精彩的資源解釋了JavaScript中的閉包是怎么工作的:Jim Jey的"JavaScript閉包",網(wǎng)址是http://jibbering.com/faq/faq_notes/closures.html。
  最后,我們將研究上下文的概念,這是許多JavaScript的面向?qū)ο筇匦再囈越⒌幕?/p>

出處:藍(lán)色理想
責(zé)任編輯:moby

上一頁 語言特性:作用域 下一頁 語言特性:上下文

◎進(jìn)入論壇網(wǎng)頁制作、網(wǎng)站綜合版塊參加討論

相關(guān)文章 更多相關(guān)鏈接
JavaScript 的事件冒泡 demo 
現(xiàn)代 javscript 編程
JS+ASP打造無刷新新聞列表
網(wǎng)頁制作前臺之javascript
我的微型論壇的簡單教程
作者文章
一個(gè)比較漂亮的日歷
仿DW8代碼折疊的HTML編輯器
關(guān)鍵字搜索 常規(guī)搜索 推薦文檔
熱門搜索:CSS Fireworks 設(shè)計(jì)比賽 網(wǎng)頁制作 web標(biāo)準(zhǔn) 用戶體驗(yàn) UE photoshop Dreamweaver Studio8 Flash 手繪 CG
站點(diǎn)最新 站點(diǎn)最新列表
周大福“敬•自然”設(shè)計(jì)大賽開啟
國際體驗(yàn)設(shè)計(jì)大會7月將在京舉行
中國國防科技信息中心標(biāo)志征集
云計(jì)算如何讓安全問題可控
云計(jì)算是多數(shù)企業(yè)唯一擁抱互聯(lián)網(wǎng)的機(jī)會
阿里行云
云手機(jī)年終巨獻(xiàn),送禮標(biāo)配299起
阿里巴巴CTO王堅(jiān)的"云和互聯(lián)網(wǎng)觀"
1499元買真八核 云OS雙蛋大促
首屆COCO桌面手機(jī)主題設(shè)計(jì)大賽
欄目最新 欄目最新列表
淺談JavaScript編程語言的編碼規(guī)范
如何在illustrator中繪制臺歷
Ps簡單繪制一個(gè)可愛的鉛筆圖標(biāo)
數(shù)據(jù)同步算法研究
用ps作簡單的作品展示頁面
CSS定位機(jī)制之一:普通流
25個(gè)最佳最閃亮的Eclipse開發(fā)項(xiàng)目
Illustrator中制作針線縫制文字效果
Photoshop制作印刷凹凸字體
VS2010中創(chuàng)建自定義SQL Rule
>> 分頁 首頁 前頁 后頁 尾頁 頁次:5/71個(gè)記錄/頁 轉(zhuǎn)到 頁 共7個(gè)記錄

藍(lán)色理想版權(quán)申明:除部分特別聲明不要轉(zhuǎn)載,或者授權(quán)我站獨(dú)家播發(fā)的文章外,大家可以自由轉(zhuǎn)載我站點(diǎn)的原創(chuàng)文章,但原作者和來自我站的鏈接必須保留(非我站原創(chuàng)的,按照原來自一節(jié),自行鏈接)。文章版權(quán)歸我站和作者共有。

轉(zhuǎn)載要求:轉(zhuǎn)載之圖片、文件,鏈接請不要盜鏈到本站,且不準(zhǔn)打上各自站點(diǎn)的水印,亦不能抹去我站點(diǎn)水印。

特別注意:本站所提供的攝影照片,插畫,設(shè)計(jì)作品,如需使用,請與原作者聯(lián)系,版權(quán)歸原作者所有,文章若有侵犯作者版權(quán),請與我們聯(lián)系,我們將立即刪除修改。

您的評論
用戶名:  口令:
說明:輸入正確的用戶名和密碼才能參與評論。如果您不是本站會員,你可以注冊 為本站會員。
注意:文章中的鏈接、內(nèi)容等需要修改的錯(cuò)誤,請用報(bào)告錯(cuò)誤,以利文檔及時(shí)修改。
不評分 1 2 3 4 5
注意:請不要在評論中含與內(nèi)容無關(guān)的廣告鏈接,違者封ID
請您注意:
·不良評論請用報(bào)告管理員,以利管理員及時(shí)刪除。
·尊重網(wǎng)上道德,遵守中華人民共和國的各項(xiàng)有關(guān)法律法規(guī)
·承擔(dān)一切因您的行為而直接或間接導(dǎo)致的民事或刑事法律責(zé)任
·本站評論管理人員有權(quán)保留或刪除其管轄評論中的任意內(nèi)容
·您在本站發(fā)表的作品,本站有權(quán)在網(wǎng)站內(nèi)轉(zhuǎn)載或引用
·參與本評論即表明您已經(jīng)閱讀并接受上述條款
推薦文檔 | 打印文檔 | 評論文檔 | 報(bào)告錯(cuò)誤  
專業(yè)書推薦 更多內(nèi)容
網(wǎng)站可用性測試及優(yōu)化指南
《寫給大家看的色彩書1》
《跟我去香港》
眾妙之門—網(wǎng)站UI 設(shè)計(jì)之道
《Flex 4.0 RIA開發(fā)寶典》
《贏在設(shè)計(jì)》
犀利開發(fā)—jQuery內(nèi)核詳解與實(shí)踐
作品集 更多內(nèi)容

雜⑦雜⑧ Gold NORMANA V2