自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

早該知道的7個JavaScript技巧

開發(fā) 前端
近幾年JavaScript取得了巨大的成就,已經(jīng)被很多開發(fā)人員所熟知,然而,我們依然能從中發(fā)現(xiàn)關(guān)于這種語言的新知識,下面文章將介紹一些開發(fā)人員應(yīng)該熟知的JavaScript技巧。

近幾年JavaScript取得了巨大的成就,已經(jīng)被很多開發(fā)人員所熟知,下面描述的是開發(fā)人員應(yīng)該熟知的一些JavaScript技巧,這些技巧你應(yīng)該現(xiàn)在就試試,而不是等著未來的某個時候偶然的發(fā)現(xiàn)它們。(相關(guān)文章推薦:那些不為人熟知的JavaScript技巧

51CTO推薦專題: 全方位、多角度學(xué)習(xí)JavaScript

 

簡潔寫法

JavaScript里我最喜歡的一種東西就是生成對象和數(shù)組的簡寫方法。在過去,如果你想創(chuàng)建一個對象,你需要這樣:

  1. var car = new Object();   
  2. car.colour = 'red';   
  3. car.wheels = 4;   
  4. car.hubcaps = 'spinning';   
  5. car.age = 4;  

下面的寫法能夠達(dá)到同樣的效果:

  1. var car = {   
  2. colour:'red',   
  3. wheels:4,   
  4. hubcaps:'spinning',   
  5. age:4   
  6. }  

簡單多了,你不需要反復(fù)使用這個對象的名稱。這樣car就定義好了,也許你會遇到invalidUserInSession的問題,這只有你在使用IE時會碰到,只要記住一點,不要右大括號前面寫分號,你就不會有麻煩。另外一個十分方便的簡寫是針對數(shù)組的。傳統(tǒng)的定義數(shù)組的方法是這樣:

  1. var moviesThatNeedBetterWriters 
  2. new Array(   
  3.  'Transformers','Transformers2','Avatar','Indiana  
  4. Jones 4'   
  5. );  

簡寫版的是這樣:

  1. var moviesThatNeedBetterWriters 
  2. = [   
  3. 'Transformers','Transformers2','Avatar','Indiana  
  4. Jones 4'   
  5. ];  

對于數(shù)組,這里有個問題,其實沒有什么圖組功能。但你會經(jīng)常發(fā)現(xiàn)有人這樣定義上面的 car ,就像這樣

  1. var car = new Array();   
  2. car['colour'] = 'red';   
  3. car['wheels'] = 4;   
  4. car['hubcaps'] = 'spinning';   
  5. car['age'] = 4;  

數(shù)組不是萬能的;這樣寫不對,會讓人困惑。圖組實際上是對象的功能,人們混淆了這兩個概念。另外一個非常酷的簡寫方法是使用與三元條件符號。你不必寫成下面的樣子:

  1. …  
  2. var direction;   
  3. if(x < 200){   
  4. direction = 1;   
  5. } else {   
  6. direction = -1;   
  7. }   
  8. … 

你可以使用三元條件符號簡化它:

  1. var direction 
  2. x < 200 ? 1 : -1;  

當(dāng)條件為true 時取問號后面的值,否則取冒號后面的值。

#p#

用JSON形式存儲數(shù)據(jù)

在我發(fā)現(xiàn)JSON之前,我使用各種瘋狂的方法把數(shù)據(jù)存貯在JavaScript固有的數(shù)據(jù)類型里面,例如:數(shù)組,字符串,中間夾雜著容易進(jìn)行拆分的標(biāo)志符號以及其它的令人討厭的東西。Douglas Crockford 發(fā)明了JSON 之后,一切全變了。

使用JSON,你可以使用JavaScript自有功能把數(shù)據(jù)存貯成復(fù)雜的格式,而且不需要再做其它的額外轉(zhuǎn)換,直接可以訪問使用。JSON是“JavaScript Object Notation”的縮寫,它用到了上面提到的兩種簡寫方法。于是,如果你想描述一個樂隊,你可能會像這樣寫:

  1. var band = {   
  2. "name":"The Red Hot Chili Peppers",   
  3. "members":[   
  4. {   
  5. "name":"Anthony Kiedis",   
  6. "role":"lead vocals"   
  7. },   
  8. {   
  9. "name":"Michael 'Flea' Balzary",   
  10. "role":"bass guitar, trumpet, backing vocals"   
  11. },   
  12. {   
  13. "name":"Chad Smith",   
  14. "role":"drums,percussion"   
  15. },   
  16. {   
  17. "name":"John Frusciante",   
  18. "role":"Lead Guitar"   
  19. }   
  20. ],   
  21. "year":"2009"   
  22. }  

你可以在JavaScript里直接使用JSON,可以把它封裝在函數(shù)里,甚至作為一個API的返回值形式。我們把這稱作 JSON-P ,很多的API都使用這種形式。你可以調(diào)用一個數(shù)據(jù)提供源,在script代碼里直接返回 JSON-P 數(shù)據(jù):

  1. <div id="delicious"></div><script>   
  2. function delicious(o){   
  3. var out = '<ul>';   
  4. for(var i=0;i<o.length;i++){   
  5. out += '<li><a 
  6. href="' + o[i].u + '">' +   
  7. o[i].d + '</a></li>';   
  8. }   
  9. out += '</ul>';   
  10. document.getElementById('delicious').innerHTML 
  11. out;   
  12. }   
  13. </script>   
  14. <script src="http://feeds.delicious.com/v2/json/codepo8/javascript?count=15&callback=delicious"></script>  

這是調(diào)用 Delicious 網(wǎng)站提供的 Web service 功能,獲得JSON格式的最近的無序書簽列表?;旧?,JSON是最輕便的描述復(fù)雜數(shù)據(jù)結(jié)構(gòu)的方法,而且它能在瀏覽器里運行。你甚至可以在PHP里用 json_decode() 函數(shù)來運行它。

JavaScript的自帶函數(shù)(Math, Array 和 String)

讓我感到驚奇的一個事情是,當(dāng)我研究了JavaScript里的math和String函數(shù)后,發(fā)現(xiàn)它們能極大的簡化我的編程勞動。使用它們,你可以省去復(fù)雜的循環(huán)處理和條件判斷。例如,當(dāng)我需要實現(xiàn)一個功能,找出數(shù)字?jǐn)?shù)組里最大的一個數(shù)時,我過去是這樣寫出這個循環(huán)的,就像下面:

  1. var numbers =  
  2. [3,342,23,22,124];   
  3. var max = 0;   
  4. for(var i=0;i<numbers.length;i++){   
  5. if(numbers[i]  
  6. > max){   
  7. max = numbers[i];   
  8.  
  9. }   
  10. }   
  11. alert(max);  

我們不用循環(huán)也能實現(xiàn):

  1. var numbers =  
  2. [3,342,23,22,124];   
  3. numbers.sort(function(a,b){return b -  
  4. a});   
  5. alert(numbers[0]);  

需要注意的是,你不能對一個數(shù)字字符數(shù)組進(jìn)行 sort() ,因為這種情況下它只會按照字母順序進(jìn)行排序。如果你想知道更多的用法,可以閱讀 這篇不錯的關(guān)于 sort() 的文章。再有一個有意思的函數(shù)就是 Math.max()。這個函數(shù)返回參數(shù)里的數(shù)字里最大的一個數(shù)字:

  1. Math.max(12,123,3,2,433,4); // returns 433
  2.   

因為這個函數(shù)能夠校驗數(shù)字,并返回其中最大的一個,所以你可以用它來測試瀏覽器對某個特性的支持情況:

  1. var scrollTop=  
  2. Math.max(   
  3. doc.documentElement.scrollTop,   
  4. doc.body.scrollTop   
  5. );  

這個是用來解決IE問題的。你可以獲得當(dāng)前頁面的 scrollTop 值,但是根據(jù)頁面上 DOCTYPE 的不同,上面這兩個屬性中只有一個會存放這個值,而另外一個屬性會是 undefined,所以你可以通過使用 Math.max() 得到這個數(shù)。閱讀這篇文章你會得到更多的關(guān)于使用數(shù)學(xué)函數(shù)來簡化JavaScript的知識。

另外有一對非常有用的操作字符串的函數(shù)是 split() 和 join()。我想最有代表性的例子應(yīng)該是,寫一個功能,用來給頁面元素附加CSS樣式。是這樣的,當(dāng)你給頁面元素附加一個CSS class時,要么它是這個元素的第一個CSS class,或者是它已經(jīng)有了一些class, 需要在已有的class后加上一個空格,然后追加上這個class。而當(dāng)你要去掉這個class時,你也需要去掉這個class前面的空格(這個在過去非常重要,因為有些老的瀏覽器不認(rèn)識后面跟著空格的class)。于是,原始的寫法會是這樣:

  1. function addclass(elm,newclass){   
  2. var c =  
  3. elm.className;   
  4. elm.className = (c === '') ? newclass : c+' '+newclass;   
  5. }  

你可以使用 split() 和 join() 函數(shù)自動完成這個任務(wù):

  1. function addclass(elm,newclass){   
  2. var classes =  
  3. elm.className.split(' ');   
  4. classes.push(newclass);   
  5. elm.className = classes.join(' ');   
  6. }  

這會確保所有的class都被空格分隔,而且你要追加的class正好放在最后。

#p#

事件委派

Web應(yīng)用都是由事件驅(qū)動運轉(zhuǎn)的。我喜歡事件處理,尤其喜歡自己定義事件。它能使你的產(chǎn)品可擴(kuò)展,而不用改動核心代碼。有一個很大的問題(也可以說是功能強(qiáng)大的表現(xiàn)),是關(guān)于頁面上事件的移除問題。你可以對某個元素安裝一個事件監(jiān)聽器,事件監(jiān)聽器就開始運轉(zhuǎn)工作。

但頁面上沒有任何指示說明這有個監(jiān)聽器。因為這種不可表現(xiàn)的問題 (這尤其讓一些新手頭疼) ,以及像IE6這樣的”瀏覽器“在太多的使用事件監(jiān)聽時會出現(xiàn)各種的內(nèi)存問題,你不得不承認(rèn)盡量少使用事件編程是個明智的做法,于是事件委托就出現(xiàn)了。

當(dāng)頁面上某個元素上的事件觸發(fā)時,而在 DOM 繼承關(guān)系上,這個元素的所有子元素也能接收到這個事件,這時你可以使用一個在父元素上的事件處理器來處理,而不是使用一堆的各個子元素上的事件監(jiān)聽器來處理。究竟是什么意思?這樣說吧,頁面上有很多超鏈接,你不想直接使用這些鏈接,想通過一個函數(shù)來調(diào)用這個鏈接,HTML代碼是這樣的:

  1. <h2>Great Web resources</h2>   
  2. <ul id="resources">   
  3. <li><a href="http://opera.com/wsc">Opera Web Standards  
  4. Curriculum</a></li>   
  5. <li><a href="http://sitepoint.com">Sitepoint</a></li>   
  6. <li><a href="http://alistapart.com">A List Apart</a></li>   
  7. <li><a href="http://yuiblog.com">YUI Blog</a></li>   
  8. <li><a href="http://blameitonthevoices.com">Blame it on the voices</a></li>   
  9. <li><a href="http://oddlyspecific.com">Oddly specific</a></li>   
  10. </ul>  

常見的做法是通過循環(huán)這些鏈接,將每個鏈接上附加一個事件處理器:

  1. // 典型的事件處理例子   
  2. (function(){   
  3. var resources 
  4. document.getElementById('resources');   
  5. var links =  
  6. resources.getElementsByTagName('a');   
  7. var all =  
  8. links.length;   
  9. for(var i=0;i<all;i++){   
  10. // Attach a listener to each link   
  11. links[i].addEventListener('click',handler,false);   
  12. };   
  13. function handler(e){   
  14. var x =  
  15. e.target; // Get the link that was  
  16. clicked   
  17. alert(x);   
  18. e.preventDefault();   
  19. };   
  20. })();  

我們用一個事件處理器也能完成這項任務(wù):

  1. (function(){   
  2. var resources 
  3. document.getElementById('resources');   
  4. resources.addEventListener('click',handler,false);   
  5. function handler(e){   
  6. var x =  
  7. e.target; // get the link tha   
  8. if(x.nodeName.toLowerCase()  
  9. === 'a'){   
  10. alert('Event  
  11. delegation:' + x);   
  12. e.preventDefault();   
  13. }   
  14. };   
  15. })();  

因為點擊事件就發(fā)生在這些頁面元素里,你要做的就是比較它們的 nodeName,找出應(yīng)該回應(yīng)這個事件的那個元素。免責(zé)聲明:上面說的這兩個關(guān)于事件的例子,在所有瀏覽器里都能運行,除了IE6,在IE6上你需要使用一個事件模型,而不是簡單的W3C的標(biāo)準(zhǔn)實現(xiàn)。這也就是我們推薦使用一些工具包的原因。

這種方法的好處并不是僅限于把多個事件處理器縮減為一個。你想想,舉個例子,你需要動態(tài)的往這個鏈接表里追加更多的鏈接。使用事件委托后,你就不需要做其它修改了;否則的話,你需要重新循環(huán)這個鏈接表,重新給每個鏈接安裝事件處理器。

#p#

匿名函數(shù)和模塊化

在JavaScript里最令人懊惱的事情是變量沒有使用范圍。任何變量,函數(shù),數(shù)組,對象,只要不在函數(shù)內(nèi)部,都被認(rèn)為是全局的,這就是說,這個頁面上的其它腳本也可以訪問它,而且可以覆蓋重寫它。解決辦法是,把你的變量放在一個匿名函數(shù)內(nèi)部,定義完之后立即調(diào)用它。例如,下面的寫法將會產(chǎn)生三個全局變量和兩個全局函數(shù):

  1. var name = 'Chris';   
  2. var age = '34';   
  3. var status = 'single';   
  4. function createMember(){   
  5. // [...]   
  6. }   
  7. function getMemberDetails(){   
  8. // [...]   
  9. }  

如果這個頁面上的其它腳本里也存在一個叫 status 的變量,麻煩就會出現(xiàn)。如果我們把它們封裝在一個 myApplication 里,這個問題就迎刃而解了:

  1. var myApplication 
  2. function(){   
  3. var name = 'Chris';   
  4. var age = '34';   
  5. var status = 'single';   
  6. function createMember(){   
  7. // [...]   
  8. }   
  9. function getMemberDetails(){   
  10. // [...]   
  11. }   
  12. }();  

但是,這樣一來,在函數(shù)外面就沒有什么功能了。如果這是你需要的,那就可以了。你還可以省去函數(shù)的名稱:

  1. (function(){   
  2. var name = 'Chris';   
  3. var age = '34';   
  4. var status = 'single';   
  5. function createMember(){   
  6. // [...]   
  7. }   
  8. function getMemberDetails(){   
  9. // [...]   
  10. }   
  11. })();  

如果你想在函數(shù)外面也能使用里面的東西,那就要做些修改。為了能訪問 createMember() 或 getMemberDetails(),你需要把它們變成 myApplication的屬性,從而把它們暴露于外部的世界:

  1. var myApplication 
  2. function(){   
  3. var name = 'Chris';   
  4. var age = '34';   
  5. var status = 'single';   
  6. return{   
  7. createMember:function(){   
  8. // [...]   
  9. },   
  10. getMemberDetails:function(){   
  11. // [...]   
  12. }   
  13. }   
  14. }();   
  15. //  
  16. myApplication.createMember() 和   
  17. //  
  18. myApplication.getMemberDetails() 就可以使用了。  

這被稱作module模式或singleton。Douglas Crockford 多次談到過這些,Yahoo User Interface Library YUI 里對此有大量的使用。但這樣一來讓我感到不便的是,我需要改變句式來使函數(shù)和變量能被外界訪問。更甚者,調(diào)用時我還需要加上myApplication 這個前綴。所以,我不喜歡這樣做,我更愿意簡單的把需要能被外界訪問的元素的指針導(dǎo)出來。這樣做后,反倒簡化了外界調(diào)用的寫法:

  1. var myApplication 
  2. function(){   
  3. var name = 'Chris';   
  4. var age = '34';   
  5. var status = 'single';   
  6. function createMember(){   
  7. // [...]   
  8. }   
  9. function getMemberDetails(){   
  10. // [...]   
  11. }   
  12. return{   
  13. create:createMember,   
  14. get:getMemberDetails   
  15. }   
  16. }();   
  17. //現(xiàn)在寫成 myApplication.get() 

和myApplication.create() 就行了。我把這個稱作 “revealingmodule pattern.”

可配置化

一旦我把所寫的JavaScript代碼發(fā)布到這個世界上,就有人想改動它,通常是人們想讓它完成一些它本身完成不了的任務(wù)—但通常也是我寫的程序不夠靈活,沒有提供用戶可自定義的功能。解決辦法是給你的腳本增加一個配置項對象。我曾經(jīng)寫過一篇深入介紹JavaScript配置項對象的文章,下面是其中的要點:在你的腳本了添加一個叫做 configuration 的對象。這個對象里面,存放所有人們在使用這個腳本時經(jīng)常要改動的東西:

◆CSS ID 和類名稱;
◆按鈕的名稱,標(biāo)簽字等;
◆諸如”每頁顯示圖片數(shù)”的值, “圖像的顯示的尺寸”的值;
◆地點,位置,以及語言設(shè)置。
◆將這個對象作為一個公用屬性返回給用戶,這樣用戶可以修改覆蓋它。

通常情況下這是你編程過程中的最后一步要做的事情。我把這些集中表現(xiàn)在了一個例子里: “Five things to do to a script before handing it over to the next developer.”。

實際上,你也希望你的代碼能夠讓人們很方面的使用,并且根據(jù)他們各自的需要進(jìn)行一些改動。如果你實現(xiàn)了這個功能,你會少收到一些抱怨你的腳本的人發(fā)送給你的讓你困惑的郵件,這些信件會告訴你,有人修改了你的腳本,而且很好用。

與后臺交互

在這么多年的編程經(jīng)歷中,我所領(lǐng)悟到的一個重要的事情就是,JavaScript是一個很優(yōu)秀的開發(fā)界面交互的語言,但如果用來處理數(shù)字或訪問數(shù)據(jù)源,那就有點使不上勁了。最初,我學(xué)習(xí)JavaScript,是用來替代Perl的,因為我很討厭非要把代碼拷貝到cgi-bin文件夾下才能使Perl運行。后來,我明白了應(yīng)該使用一種后臺工作的語言來處理主要的數(shù)據(jù),而不能什么事情都讓JavaScript去做。更重要的是我們要考慮安全性和語言特征。

如果我訪問一個Web service, 我可以獲取到JSON-P 格式的數(shù)據(jù),在客戶端瀏覽器里我把它做各種各樣的數(shù)據(jù)轉(zhuǎn)換,但當(dāng)我有了服務(wù)器時,我有了更多的方法來轉(zhuǎn)換數(shù)據(jù),我可以在Server端生成JSON或HTML格式的數(shù)據(jù)返回給客戶端,以及緩存數(shù)據(jù)等操作。如果你事先了解了并準(zhǔn)備了這些,你會長期收益,省去了很多頭疼的時間。

編寫適用各種瀏覽器的程序是種浪費時間,使用工具包吧!在我最初開始搞Web開發(fā)時,在訪問頁面時,究竟是使用document.all還是使用document.layers 的問題上痛苦的掙扎了很久。我選擇了document.layers,因為我喜歡任何層都是自己的document的思想 (而且我寫了太多的document.write 來生成元素)。層模式最終失敗了,于是我開始使用document.all。

當(dāng)Netscape 6公布只支持W3C DOM模型時,我很高興,但其實用戶并不關(guān)心這些。用戶只是看見這種瀏覽器不能顯示大多數(shù)瀏覽器都能正常顯示的東西—這是我們編碼的問題。我們編寫了短視的代碼,只能運行在當(dāng)前的環(huán)境下,而不幸的是,我們的運行環(huán)境卻在不停的改變。我已經(jīng)浪費了太多的時間來處理對各種瀏覽器各種版本兼容的問題。善于處理這類問題提供了我一個好的工作機(jī)會。但現(xiàn)在我們不必在忍受這種痛苦了。

一些工具包,例如 YUI, jQuery 以及Dojo都能夠幫我們處理這類問題。它們通過抽象各種接口實現(xiàn)來處理瀏覽器的各種問題,像版本不兼容,設(shè)計缺陷等,把我們從痛苦中解救出來。除非你要測試某個Beta版的瀏覽器,千萬不要在自己的程序里添加修正瀏覽器的缺陷的代碼,因為你很有可能當(dāng)瀏覽器已經(jīng)修改了這個問題時,你卻忘了刪除你的代碼。另一方面,完全依賴于工具包也是個短視的行為。工具包可以幫你快速的開發(fā),但如果你不深入理解JavaScript,你也會做錯事。

文章轉(zhuǎn)自外刊IT評論,

原文地址:http://www.aqee.net/2010/05/06/seven-javascript-things-i-wish-i-knew-much-earlier-in-my-career/

【編輯推薦】

  1. 那些不為人熟知的JavaScript技巧
  2. JavaScript最讓人費解的十件事
  3. 專家學(xué)者對于JavaScript解釋進(jìn)行詳細(xì)說明
  4. JavaScript語法中12個需要繞開的陷阱
  5. 10個自由豐富的jQuery或JavaScript編輯器
責(zé)任編輯:王曉東 來源: 外刊IT評論
相關(guān)推薦

2012-02-13 13:44:46

JavaScript

2023-07-07 14:47:46

JavaScript技巧

2020-04-03 19:21:59

JavaScript編程語言開發(fā)

2024-04-03 10:29:13

JavaScrip優(yōu)化技巧

2021-04-12 15:54:45

Android 開發(fā)技巧

2020-07-28 08:14:30

JavaScript開發(fā)技術(shù)

2022-06-08 10:42:34

ReduceJavaScript技巧

2020-07-11 09:45:33

Python編程語言開發(fā)

2009-09-25 10:55:07

Windows Mob

2023-03-19 16:02:33

JavaScrip技巧編程語言

2020-11-03 09:51:04

JavaScript開發(fā) 技巧

2022-10-20 15:12:43

JavaScript技巧開發(fā)

2017-11-07 21:58:25

前端JavaScript調(diào)試技巧

2018-09-20 17:05:01

前端程序員JavaScript

2022-12-22 14:44:06

JavaScript技巧

2022-12-25 16:03:31

JavaScript技巧

2023-08-11 17:39:43

JavaScriptWeb 應(yīng)用程序

2020-09-29 08:14:46

JavaScript開發(fā)代碼

2023-11-26 17:54:07

JavaScript開發(fā)

2024-08-21 14:55:02

點贊
收藏

51CTO技術(shù)棧公眾號