真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

javascript笑話,關(guān)于編程的笑話

javascript alert清除成功是什么段子

就是說一公司的系統(tǒng)里面, 客戶要求點(diǎn)一個(gè)按鈕清空緩存, 然后這家伙寫了個(gè)a href="javascript: alert("清除成功!")" 清空緩存/a,自己騙自己, 啥都沒干, 就彈了個(gè)窗。

創(chuàng)新互聯(lián)公司專注于象山企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),商城系統(tǒng)網(wǎng)站開發(fā)。象山網(wǎng)站建設(shè)公司,為象山等地區(qū)提供建站服務(wù)。全流程按需搭建網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

緩存(cache),原始意義是指訪問速度比一般隨機(jī)存取存儲(chǔ)器(RAM)快的一種高速存儲(chǔ)器,通常它不像系統(tǒng)主存那樣使用DRAM技術(shù),而使用昂貴但較快速的SRAM技術(shù)。緩存的設(shè)置是所有現(xiàn)代計(jì)算機(jī)系統(tǒng)發(fā)揮高性能的重要因素之一。

緩存是指可以進(jìn)行高速數(shù)據(jù)交換的存儲(chǔ)器,它先于內(nèi)存與CPU交換數(shù)據(jù),因此速率很快。L1 Cache(一級(jí)緩存)是CPU第一層高速緩存。內(nèi)置的L1高速緩存的容量和結(jié)構(gòu)對(duì)CPU的性能影響較大,不過高速緩沖存儲(chǔ)器均由靜態(tài)RAM組成,結(jié)構(gòu)較復(fù)雜,在CPU管芯面積不能太大的情況下,L1級(jí)高速緩存的容量不可能做得太大。

一般L1緩存的容量通常在32—256KB。L2 Cache(二級(jí)緩存)是CPU的第二層高速緩存,分內(nèi)部和外部?jī)煞N芯片。內(nèi)部的芯片二級(jí)緩存運(yùn)行速率與主頻相同,而外部的二級(jí)緩存則只有主頻的一半。

誰能告訴我這個(gè)笑話的意思 JavaScript 程序員和 Python 程序員相遇了。 Pyt

是不是說兩者都不指定變量的類型。

js不指定1是數(shù)字就當(dāng)作字符串相加,py不指定類型只要會(huì)跑會(huì)叫都當(dāng)作鴨子。。。瞎猜的

1 1等于幾笑話jdjshdhdhhrkshhjsj

1

母親:“明明,你上學(xué)有三個(gè)多月了,你覺得語文和數(shù)學(xué)哪一門好學(xué)些呢?”

明明:“數(shù)學(xué)好學(xué)?!?/p>

母親:“為什么?”

明明:“因?yàn)檎Z文生字多,數(shù)學(xué)只有0到9十個(gè)數(shù)字。”

2

奶奶:“1+2等于幾?”

孫子:“等于3。”

奶奶:“答對(duì)了,因此你會(huì)得到3塊糖?!?/p>

孫子:“早知道是這樣,我就說是等于5就好啦! ”

3

小明數(shù)學(xué)不好,被父母轉(zhuǎn)到一間教會(huì)的學(xué)校,半年后數(shù)學(xué)成績(jī)?nèi)獳,媽媽問:“是修女教得好?是教材好?是禱告?...” “都不是”小明說:“進(jìn)教的第一天,我看見一個(gè)人被釘死在加號(hào)上面,我就知道...他們是玩真的! ”

4

數(shù)學(xué)課上,小明趴在桌子上睡覺,數(shù)學(xué)老師沒有發(fā)覺,還在滔滔不絕地講課。下課了,小明醒來,問同桌的數(shù)學(xué)課代表:我睡了多久了?數(shù)學(xué)課代表說:你已經(jīng)睡了一節(jié)課,大概2400秒,40分鐘,三分之二小時(shí),三十六分之一天,一千零八十分之一個(gè)月,一萬二千九百六十分之一年,一百二十九萬六千分之一世紀(jì)了吧!

5

寶寶數(shù)學(xué)很好,2歲就可以從1數(shù)到10了。后來,我告訴他0比1還校

今天吃餃子,我說:“寶寶,你數(shù)數(shù)你想吃幾個(gè)餃子?”

“0,1,2,3……”一邊說一邊拿起一個(gè)餃子,“這是第0個(gè)?!?/p>

老婆怒吼:“下一代還是做程序員的命! ”

6

一次,上美術(shù)課。不知道老師說了什么,只知道老師說了一句:“我只想說4個(gè)字‘我的天’?!?/p>

有一個(gè)同學(xué),聽見了后說了一句:“老師,你說錯(cuò)了,那根本是2個(gè)字?!背聊艘粫?huì),全班爆笑。

天,我們班的數(shù)學(xué)怎么了?老師也無語了

7

老師:你說我們國(guó)家有哪些數(shù)學(xué)家?

學(xué)生:數(shù)不清

老師:對(duì),蘇步青是一個(gè),還有呢?

javascript代碼寫法問題

本人在開發(fā)工作中就曾與不按規(guī)范來開發(fā)的同事合作過,與他合作就不能用"愉快"來形容了?,F(xiàn)在本人撰寫此文的目的除了與大家分享一點(diǎn)點(diǎn)經(jīng)驗(yàn)外,更多的是希望對(duì)未來的合作伙伴能夠起到一定的借鑒作用。當(dāng)然,如果我說的有不科學(xué)的地方還希望各路前輩多多指教。下面分條目列出各種規(guī)范要求,這些要求都是針對(duì)同事編碼毛病提出來的,好些行業(yè)約定的其它規(guī)范可能不會(huì)再提及。1. 保證代碼壓縮后不出錯(cuò)對(duì)于大型的JavaScript項(xiàng)目,一般會(huì)在產(chǎn)品發(fā)布時(shí)對(duì)項(xiàng)目包含的所有JavaScript文件進(jìn)行壓縮處理,比如可以利用Google Closure Compiler Service對(duì)代碼進(jìn)行壓縮,新版jQuery已改用這一工具對(duì)代碼進(jìn)行壓縮,這一般會(huì)去掉開發(fā)時(shí)寫的注釋,除去所有空格和換行,甚至可以把原來較長(zhǎng)的變量名替換成短且無意義的變量名,這樣做的目的是加快文件的下載速度,同時(shí)也減小網(wǎng)站訪問帶來的額外數(shù)據(jù)流量,另外在代碼保護(hù)上也起到了一點(diǎn)點(diǎn)作用,至少壓縮后的代碼即使被還原還是沒那么容易一下讀懂的。要想代碼能正確通過壓縮,一般要求語句都要以分號(hào)正常結(jié)束,大括號(hào)也要嚴(yán)格結(jié)束等,具體還要看壓縮工具的要求。所以如果一開始沒有按標(biāo)準(zhǔn)來做,等壓縮出錯(cuò)后再回去找錯(cuò)誤那是浪費(fèi)時(shí)間。2. 保證代碼能通過特定IDE的自動(dòng)格式化功能一般較為完善的開發(fā)工具(比如Aptana Studio)都有代碼"自動(dòng)格式"化功能,這一功能幫助實(shí)現(xiàn)統(tǒng)一換行、縮進(jìn)、空格等代碼編排,你可以設(shè)置自己喜歡的格式標(biāo)準(zhǔn),比如左大括號(hào){是否另起一行。達(dá)到這個(gè)要求的目的在于方便你的開發(fā)團(tuán)隊(duì)成員拿你代碼的一個(gè)副本用IDE自動(dòng)格式化成他喜歡或熟悉的風(fēng)格進(jìn)行閱讀。你同事需要閱讀你的代碼,可能是因?yàn)槟銓懙氖峭ㄓ梅椒?,他在其它模塊開發(fā)過程中也要使用到,閱讀你的代碼能最深入了解方法調(diào)用和實(shí)現(xiàn)的細(xì)節(jié),這是簡(jiǎn)單API文檔不能達(dá)到的效果。3. 使用標(biāo)準(zhǔn)的文檔注釋這一要求算是最基本的,這有利于在方法調(diào)用處看到方法的具體傳參提示,也可以利用配套文檔工具生成html或其它格式的開發(fā)文檔供其他團(tuán)隊(duì)成員閱讀,你可以嘗試使用jsdoc-toolkit。如果你自動(dòng)生成的API是出自一個(gè)開放平臺(tái),就像facebook.com應(yīng)用,那么你的文檔是給天下所有開發(fā)者看的。另外編寫完整注釋,也更方便團(tuán)隊(duì)成員閱讀你的代碼,通過你的參數(shù)描述,團(tuán)隊(duì)成員可以很容易知道你編寫的方法傳參與實(shí)現(xiàn)細(xì)節(jié)。當(dāng)然也方便日后代碼維護(hù),這樣即使再大的項(xiàng)目,過了很長(zhǎng)時(shí)間后,回去改點(diǎn)東西也就不至于自己都忘記了當(dāng)時(shí)自己寫的代碼是怎么一回事了。4. 使用規(guī)范有意義的變量名使用規(guī)范有意義的變量名可以提高代碼的可讀性,作為大項(xiàng)目開發(fā)成員,自己寫的代碼不僅僅要讓別人容易看懂。開發(fā)大項(xiàng)目,其實(shí)每個(gè)人寫的代碼量可能都比較大,規(guī)范命名,日后自己看回自己的代碼也顯的清晰易懂,比如日后系統(tǒng)升級(jí)或新增功能,修改起代碼來也輕松多了。如果到頭發(fā)現(xiàn)自己當(dāng)初寫的代碼現(xiàn)在看不太懂了,那還真是天大的笑話了。當(dāng)然,使用有意義的變量名也盡量使用標(biāo)準(zhǔn)的命名,比如像這里:var me = this也許沒有var self = this好,因?yàn)閟elf是Python中的關(guān)鍵字,在Python中self就是通常語言this的用法。再看下面一個(gè)例子,加s顯然比沒有加來的科學(xué)些,這樣可以知道這個(gè)變量名存的是復(fù)數(shù),可能是數(shù)組等: var li = document.getElementsByTagName('li') var lis = document.getElementsByTagName('li') 5. 不使用生偏語法JavaScript作為一門動(dòng)態(tài)腳本語言,靈活性既是優(yōu)點(diǎn)也是缺點(diǎn),眾所周知,動(dòng)態(tài)語言不同層次開發(fā)人員對(duì)實(shí)現(xiàn)同樣一個(gè)功能寫出來的代碼在規(guī)范或語法上會(huì)存在較大的差別。不管怎么樣,規(guī)范編碼少搞怪,不把簡(jiǎn)單問題復(fù)雜化,不違反代碼易讀性原則才是大家應(yīng)該做的。比如這語句:typeof(b) == 'string' alert(b)應(yīng)該改為:if (typeof(b) == 'string') alert(b),像前面那種用法,利用了運(yùn)算符解析機(jī)制:如果檢測(cè)到前語句返回false就不再檢測(cè)后面語句,在代碼優(yōu)化方面也有提到把最可能出現(xiàn)的情況首先判斷,像這種寫法如果條件少還好,如果條件較多而且語句也長(zhǎng),那代碼可讀性就相當(dāng)差。又比如:+function(a){var p = a;}( 'a')應(yīng)該改為:(function(a){var p = a;})( 'a'),其實(shí)function前面的+號(hào)與包含function的()括號(hào)作用是一樣的,都是起運(yùn)算優(yōu)先作用,后者是常見且容易看明白的防止變量污染的做法,比如好些流行JavaScript框架就是采用后面這種方式。再說個(gè)降低代碼可讀性的例子,如:function getPostionTxt(type){return type == 2 ? "野外" : (type == 3 ? "商城" : (type == 4 ? "副本" : null));}應(yīng)該改成:function getPostionTxt(type){var typeData={"2":"野外","3":"商城","4":"副本"};if (typeData[type]) return typeData[type]; else return null;}。如果type是從0開始不間斷的整數(shù),那么直接使用數(shù)組還更簡(jiǎn)單,這種結(jié)果看起來就清晰多了,看到前面那種多層三元表達(dá)式嵌套頭不暈嗎。6. 不在語句非賦值地方出生中文語句中不應(yīng)該出現(xiàn)中文我想一般人都知道,雖然這樣做不影響程序運(yùn)行,但是顯然有背行業(yè)標(biāo)準(zhǔn)要求,當(dāng)然我們也不是在使用"易語言"做開發(fā)。關(guān)于這一個(gè)問題,我本來不想把它拿出來說的,但我確實(shí)遇到有人這樣做的,也不知道是不是因?yàn)樗挠⒄Z實(shí)在太爛了,至少還可以用拼音吧,另外尋求翻譯工具幫忙也不錯(cuò)的選擇。我舉例如下,像以下寫法出現(xiàn)在教學(xué)中倒還可以理解:this.user['名字'] = '張三' 或者 this.user.名字 = '張三'7. 明確定義函數(shù)固定數(shù)量的參數(shù)固定數(shù)量參數(shù)的函數(shù)內(nèi)部不使用arguments去獲取參數(shù),因?yàn)檫@樣,你定義的方法如果包含較多的腳本,就不能一眼看到這個(gè)方法接受些什么參數(shù)以及參數(shù)的個(gè)數(shù)是多少。比如像下面: var $ = function(){return document.getElementById(arguments[0]);}應(yīng)該改成:var $ = function(elemID){return document.getElementById(elemID);} 8. 不必?zé)嶂詣?dòng)態(tài)事件綁定雖然知道事件可以動(dòng)態(tài)綁定,比如使用addEventListener或者使用jQuery的bind方法,也知道采用動(dòng)態(tài)事件綁定可以讓XHTML更干凈,但是一般情況下我還是建議直接把事件寫在DOM節(jié)點(diǎn)上,我認(rèn)為這樣可以使代碼變得更容易維護(hù),因?yàn)檫@樣做,我們?cè)诓榭丛创a的時(shí)候就可以容易地知道什么Element綁定了什么方法,簡(jiǎn)單說這樣更容易知道一個(gè)按鈕或鏈接點(diǎn)擊時(shí)調(diào)了什么方法腳本。9. 降低代碼與XHTML的耦合性不要過于依賴DOM的一些內(nèi)容特征來調(diào)用不同的腳本代碼,而應(yīng)該定義不同功能的方法,然后在DOM上調(diào)用,這樣不管DOM是按鈕還是鏈接,方法的調(diào)用都是一樣的,比如像下面的實(shí)現(xiàn)顯然會(huì)存在問題: function myBtnClick(obj) { if (/確定/.test(obj.innerHTML)) alert('OK'); else if (/取消/.test(obj.innerHTML)) alert('Cancel'); else alert('Other'); } a herf="javascript:;" onclick="myBtnClick(this)"確定/aa herf="javascript:;" onclick="myBtnClick(this)"取消/a 上面例子其實(shí)在一個(gè)函數(shù)內(nèi)處理了兩件事情,應(yīng)該分成兩個(gè)函數(shù),像上面的寫法,如果把鏈接換成按鈕,比如改成這樣:input type="button" onclick="myBtnClick(this)" value="確定" /,那么myBtnClick函數(shù)內(nèi)部的obj.innerHTML就出問題了,因?yàn)榇藭r(shí)應(yīng)該obj.value才對(duì),另外如果把按鈕名稱由中文改為英文也會(huì)出問題,所以這種做法問題太多了。10. 一個(gè)函數(shù)應(yīng)該返回統(tǒng)一的數(shù)據(jù)類型因?yàn)镴avaScrip是弱類型的,在編寫函數(shù)的時(shí)候有些人對(duì)于返回類型的處理顯得比較隨便,我覺得應(yīng)該像強(qiáng)類型語言那樣返回,看看下面的兩個(gè)例子: function getUserName(userID) { if (data[userID]) return data[userID]; else return false; } 應(yīng)該改為: function getUserName(userID) { if (data[userID]) return data[userID]; else return ""; } 這個(gè)方法如果在C#中定義,我們知道它準(zhǔn)備返回的數(shù)據(jù)類型應(yīng)該是字符串,所以如果沒有找到這個(gè)數(shù)據(jù)我們就應(yīng)該返回空的字符串,而不是返回布爾值或其它不合適的類型。這并沒有影響到函數(shù)將來的調(diào)用,因?yàn)榉祷氐目兆址谶壿嬇袛嗌峡杀徽J(rèn)作"非",即與false一樣,除非我們使用全等于"==="或typeof進(jìn)行判斷。11. 規(guī)范定義JSON對(duì)象,補(bǔ)全雙引號(hào)使用標(biāo)準(zhǔn)肯定是有好處的,那么為什么還是有人不使用標(biāo)準(zhǔn)呢?我想這可能是懶或習(xí)慣問題。也許還會(huì)有人跟我說,少寫引號(hào)可以減輕文件體積,我認(rèn)為這有道理但不是重點(diǎn)。對(duì)于服務(wù)器返回的JSON數(shù)據(jù),使用標(biāo)準(zhǔn)結(jié)構(gòu)可以利用Firefox瀏覽器的JSONView插件方便查看(像查看XML那樣樹形顯示),另外你如果使用jQuery做開發(fā),最新版本jQuery1.4+是對(duì)JSON格式有更高要求的,具體的可以自己查閱jQuery更新文檔。比如:{name:"Tom"}或{'name':'Tom'}都應(yīng)該改成{"name":"Tom"}。12. 不在文件中留下未來確定不再使用的代碼片段當(dāng)代碼調(diào)整或重構(gòu)后,之前編寫的不再使用的代碼應(yīng)該及時(shí)刪除,如果認(rèn)為這些代碼還有一定利用價(jià)值可以把它們剪切到臨時(shí)文件中。留在項(xiàng)目中不僅增加了文件體積,這對(duì)團(tuán)隊(duì)其它成員甚至自己都起到一定干擾作用,怕將來自己看回代碼都搞不懂這方法是干什么的,是否有使用過。當(dāng)然可以用文檔注釋標(biāo)簽@deprecated把這個(gè)方法標(biāo)識(shí)為不推薦的。13. 不重復(fù)定義其他團(tuán)隊(duì)成員已經(jīng)實(shí)現(xiàn)的方法對(duì)于大型項(xiàng)目,一般會(huì)有部分開發(fā)成員實(shí)現(xiàn)一些通用方法,而另外一些開發(fā)成員則要去熟悉這些通用方法,然后在自己編寫模塊遇到有調(diào)用的需要就直接調(diào)用,而不是像有些開發(fā)者喜歡"單干",根本不會(huì)閱讀這些通用方法文檔,在自己代碼中又寫了一遍實(shí)現(xiàn),這不僅產(chǎn)生多余的代碼量,當(dāng)然也是會(huì)影響團(tuán)隊(duì)開發(fā)效率的,這是沒有團(tuán)隊(duì)合作精神的表現(xiàn),是重復(fù)造輪子的悲劇。比如在通用類文件Common.js有定義function $(elemID){return document.getElementById(elemID)}那么就不應(yīng)該在Mail.js中再次出現(xiàn)這一功能函數(shù)的重復(fù)定義,對(duì)于一些復(fù)雜的方法更應(yīng)該如此。14. 調(diào)用合適的方法當(dāng)有幾個(gè)方法都可以實(shí)現(xiàn)同類功能的時(shí)候,我們還是要根據(jù)場(chǎng)景選擇使用最合適的方法。下面拿jQuery框架的兩個(gè)AJAX方法來說明。如果確定服務(wù)器返回的數(shù)據(jù)是JSON應(yīng)該直接使用$.getJSON,而不是使用$.get得到數(shù)據(jù)再用eval函數(shù)轉(zhuǎn)成JSON對(duì)象。如果因?yàn)楸敬握?qǐng)求要傳輸大量的數(shù)據(jù)而不得以使用$.post也應(yīng)該采用指定返回?cái)?shù)據(jù)類型(設(shè)置dataType參數(shù))的做法。如果使用$.getJSON,在代碼中我們一眼能看出本次請(qǐng)求服務(wù)器返回的是JSON。溫馨提示:jQuery1.4后,如果服務(wù)器有設(shè)置數(shù)據(jù)輸出的ContentType,比如ASP.NET C#設(shè)置 Response.ContentType = "application/json",那么$.get將與$.getJSON的使用沒有什么區(qū)別。15. 使用合適的控件存儲(chǔ)合適的數(shù)據(jù)曾發(fā)現(xiàn)有人利用DIV來保存JSON數(shù)據(jù),以待頁(yè)面下載后將來使用,像這樣:div id="json"{ "name":"Tom"}/div,顯然這個(gè)DIV不是用來界面顯示的,如果非要這樣做,達(dá)到使用HTML文件進(jìn)行數(shù)據(jù)緩存的作用,至少改成用隱藏域來存這數(shù)據(jù)更合理,比如改成:input type="hidden" value=" { "name":"Tom"}" /。其實(shí)也可以利用window對(duì)象來保存一些數(shù)據(jù),像上面的例子,我們可以在AJAX請(qǐng)求頁(yè)直接包含這樣的腳本塊:scriptwindow.userData = { "name":"Tom"};/script,當(dāng)在AJAX請(qǐng)求回調(diào)函數(shù)中執(zhí)行完$( "#MyDiv ").html(data)后,在window上就馬上有了這一變量。如果采用第一種方法,將不可避免eval(document.getElementById("UserData").innerHTML)。如果在window對(duì)象存放大量數(shù)據(jù)的話,這些數(shù)據(jù)不用時(shí)要及時(shí)手動(dòng)清理它們,它們是要等瀏覽器刷新或重啟后才會(huì)消失的,這就會(huì)增加內(nèi)存開銷。16. 永遠(yuǎn)不要忽略代碼優(yōu)化工作代碼最優(yōu)化是每個(gè)程序員應(yīng)該努力達(dá)到的目標(biāo),也應(yīng)該成為程序員永遠(yuǎn)的追求。寫代碼的時(shí)候,不應(yīng)該急著把功能實(shí)現(xiàn)出來,要想一下如何寫代碼,代碼的執(zhí)行效率才是較好的。舉個(gè)例子:假設(shè)有定義getElementById的快捷方法functoin $(elemID){return document.getElementById(elemID)},那么有人可能會(huì)寫出這樣的代碼$("MyDiv").parentNode.removeChild($("MyDiv")),其實(shí)這里執(zhí)行了兩次getElementById DOM查找,如果改成這樣將更好:var myDiv = $("MyDiv"); myDiv.parentNode.removeChild(myDiv)。還好getElementById的DOM查找算比較快,如果換成getElementsByTagName則更應(yīng)該注重優(yōu)化了。jQuery開發(fā)團(tuán)隊(duì)也有提醒大家要注意這方面的問題。當(dāng)然,代碼優(yōu)化技巧也是需要個(gè)人不斷積累的。曾有朋友跟我說他寫網(wǎng)站后臺(tái)代碼從來不用考慮優(yōu)化的,因?yàn)樗麄兙W(wǎng)站用的是至強(qiáng)四核服務(wù)器,我覺得這是很可笑的。17. 會(huì)分析策劃文檔,能用面向?qū)ο蠓椒ㄟM(jìn)行接口定義和代碼組織這一能力對(duì)于每一個(gè)程序員來說都是非常重要的,這也是決定一個(gè)程序員水平高低的一個(gè)重要因素。能夠把需求細(xì)化并抽象出不同的類,然后有條理地編寫代碼,使代碼結(jié)構(gòu)清晰,可讀性高,代碼易于維護(hù),不至于太過程化而且雜亂無章,這樣才算是一個(gè)優(yōu)秀的程序員。

Javascript 的前后端統(tǒng)一是個(gè)"笑話"嗎

javascript是前端開發(fā)語言,經(jīng)常與html、css技術(shù)一起構(gòu)成前端開發(fā)。javascript一般通過ajax與后臺(tái)進(jìn)行數(shù)據(jù)交互。

其實(shí)和javascript有個(gè)相同名稱的java 是后端開發(fā)語言,他倆雖然都有java這個(gè)單詞,但是他倆沒什么直接關(guān)系,就像雷鋒和雷鋒塔的關(guān)系一樣。

javascript框架是什么意思?有什么作用?怎么理解?最好舉個(gè)例子

淺談js框架設(shè)計(jì) 在這個(gè)JavaScript框架隨處亂跑的時(shí)代,你是否考慮過寫一個(gè)自己的框架?下面的內(nèi)容也許會(huì)有點(diǎn)幫助。

一個(gè)框架應(yīng)該包含哪些內(nèi)容?

1.語言擴(kuò)展

大部分現(xiàn)有的框架都提供了這部分內(nèi)容,語言擴(kuò)展應(yīng)當(dāng)是以ECMAScript為基礎(chǔ)進(jìn)行的,不應(yīng)當(dāng)依賴任何宿主環(huán)境,也就是說,作為一個(gè)框架的設(shè)計(jì)者,你應(yīng)當(dāng)保證你的語言擴(kuò)展可以工作在任何宿主環(huán)境中,而不是僅僅適合瀏覽器環(huán)境。你必須保證把它放到WScript,SpiderMonkeyShell,Rhino Shell,Adobe ExtendScript Toolkit甚至FlashActionScript等環(huán)境中都能正確的工作,舉個(gè)現(xiàn)實(shí)一點(diǎn)的例子setTimeout不可以出現(xiàn)在其中,你也不能用XMLHTTP加載腳本運(yùn)行,盡管它們看起來很貼近語言。保持這一部分的獨(dú)立性可以讓你方便的移植你的框架到其他宿主環(huán)境下?!?/p>

2.數(shù)據(jù)結(jié)構(gòu)和算法

JS本身提供的內(nèi)置對(duì)象非常有限,很多時(shí)候,框架應(yīng)該提供一些數(shù)據(jù)結(jié)構(gòu)和算法來幫助使用者更好的完成邏輯表達(dá)。但我認(rèn)為隨便翻本數(shù)據(jù)結(jié)構(gòu)或者算法書用JS挑幾個(gè)實(shí)現(xiàn)了加到框架中是不負(fù)責(zé)任的,多數(shù)數(shù)據(jù)結(jié)構(gòu)應(yīng)當(dāng)以庫(kù)的形式存在而非框架??蚣苤械臄?shù)據(jù)結(jié)構(gòu)應(yīng)該足夠常用而且實(shí)現(xiàn)不是非常復(fù)雜的,可以考慮的如集合、哈希表、鏈表、有序數(shù)組以及有序數(shù)組上的二分搜索。對(duì)JS來說,對(duì)象是一個(gè)天然的字符串哈希表,而集合很容易在哈希表上實(shí)現(xiàn),因此只需要處理掉Object的內(nèi)置方法,我們就可以實(shí)現(xiàn)一個(gè)高效的集合或哈希表。

3.DOM擴(kuò)展

JS主要應(yīng)用于Web開發(fā),目前所有的框架也都用于瀏覽器環(huán)境,那么,瀏覽器端環(huán)境里重點(diǎn)中的重點(diǎn)DOM當(dāng)然也是框架的擴(kuò)展目標(biāo)了,如果一個(gè)框架不提供DOM的擴(kuò)展,那么其實(shí)基本沒什么用處了。需要注意的是,DOM擴(kuò)展也有w3c的標(biāo)準(zhǔn)可依,所以,不要嘗試為各種瀏覽器做一些奇怪的擴(kuò)展,比如FF下面的element們的prototype,框架的編寫者應(yīng)當(dāng)無視它們。DOM擴(kuò)展的主要任務(wù)之一是兼容性,不同瀏覽器上的DOM實(shí)現(xiàn)相差很多,框架必須消除這些實(shí)現(xiàn)帶來的差異,提供統(tǒng)一的訪問方式。當(dāng)然,做為框架,應(yīng)當(dāng)提供一些更為方便的接口,將宿主提供的DOM對(duì)象用js對(duì)象封裝是個(gè)不錯(cuò)的想法,但是同時(shí)這也很可能會(huì)造成內(nèi)存泄露,所以做這事之前,了解內(nèi)存泄露是必要的。實(shí)際上,自己想象的擴(kuò)展遠(yuǎn)不如W3C的設(shè)計(jì),比如如果你能更完整地實(shí)現(xiàn)XPath,你就能比JQuery做的更好。

4.AJAX擴(kuò)展

大部分現(xiàn)有框架出現(xiàn)的原因都是因?yàn)锳JAX,所以如果你想設(shè)計(jì)一個(gè)受歡迎的框架,AJAX是必須要做的。跟DOM擴(kuò)展很相似,AJAX擴(kuò)展的主要任務(wù)是兼容和內(nèi)存泄露,對(duì)AJAX的核心組件XMLHttpRequest對(duì)象,必須在IE6中使用ActiveX創(chuàng)建,而ActiveX又有各種版本,而隨之而來的內(nèi)存泄露和兼容性變得非常麻煩,比如:事件函數(shù)名大小寫、this指向、事件函數(shù)的null賦值。處理好這些兼容性的基礎(chǔ)上,可以做進(jìn)一步的工作,提供一些常用的實(shí)現(xiàn)。應(yīng)該指出的是,除非你確定你提供的接口比原來的更好,否則不要改變?cè)瓉淼腦MLHttpRequest對(duì)象的接口,比如寫一個(gè)Request函數(shù)來代替open和send,如果你不清楚W3C的專家們?yōu)槭裁催@么設(shè)計(jì),請(qǐng)不要把他們想象成傻瓜。我想自己另外寫一個(gè)兼容且內(nèi)存安全的XMLHttpRequest加入到自己框架的命名空間里,使它從外部看上去跟W3C描述的XMLHttpRequest一模一樣是不錯(cuò)的辦法,對(duì)XMLHttpRequest我認(rèn)為唯一可以考慮的修改是提供onsuccess事件。當(dāng)然針對(duì)一些復(fù)雜功能的AJAX擴(kuò)展也是可行的,比如HTMLHttpRequest類似的擴(kuò)展可以讓AJAX初學(xué)者喜歡你的框架。

5.效果

時(shí)間效果是最能刺激用戶神經(jīng)的,漸隱、緩動(dòng)、滑動(dòng)、顏色漸變這些都很不錯(cuò),其實(shí)技術(shù)難度也不是很高。拖動(dòng)效果則是瀏覽器中一個(gè)很重要的效果,用鼠標(biāo)事件來模擬本來很容易,不過兼容和setCapture也是很麻煩的事情。這一部分內(nèi)容量力而為就可以了。

7.腳本管理

因?yàn)榇蠹曳浅O矚gC++風(fēng)格的include或者JAVA風(fēng)格的import,很多框架提供了基于AJAX的腳本管理,不過同步加載的效率問題是巨大的。之前我們?cè)?jīng)作過各種嘗試,希望找到一個(gè)瀏覽器中不用XMLHTTP加載外部js的方法,但是最后得出的結(jié)論是:不可能。

關(guān)于這個(gè),略微思考就可以知道,Java C++ C#都是編譯型語言,include 和import都是編譯期處理,在js中做到類似的事情是不太可能的。為了實(shí)現(xiàn)類似的功能,我想我們可以利用服務(wù)端程序或者編寫一個(gè)文本工具來實(shí)現(xiàn)。

YUI將所有的js文件依賴關(guān)系提取出來的做法是可行的,不過這不能算是include的實(shí)現(xiàn)方式了,維護(hù)依賴關(guān)系不是一件很簡(jiǎn)單的事情。

8.控件

EXT的成功告訴我們:提供優(yōu)質(zhì)的控件才是框架的王道。你不能指望優(yōu)質(zhì)的擴(kuò)展會(huì)吸引更多使用者。多數(shù)人只關(guān)心如何快速完成手邊的工作。當(dāng)然不是所有框架都要提供這部分內(nèi)容??丶脡娜Q于能力和美工,不過至少要保證框架里的控件不會(huì)內(nèi)存泄露。

框架設(shè)計(jì)的若干原則:

1.不要做多余的事

對(duì)這框架設(shè)計(jì)來說,我認(rèn)為一個(gè)非常必要的原則就是不要做多余的事情,舉個(gè)極端的的例子:

function add(a,b)

{

return a+b;

}

這樣的代碼如果出現(xiàn)在框架中,就是個(gè)十足的笑話。不過大多數(shù)時(shí)候,事情不是那么明顯,很多框架試圖用某種形式在JS中"實(shí)現(xiàn)"OOP,但是實(shí)際上,JS本身是OO的(ECMA262中明確指出來的,不像某些人所說是基于對(duì)象云云)只是有一些語法跟Java等語言不同。那么顯然這些OOP的"實(shí)現(xiàn)"其實(shí)是跟上面的例子一樣的道理。另一個(gè)例子是Array.prototype.clone

Array.prototype.clone=function(){

return this.slice();

}

2.慎用prototype擴(kuò)展

很多框架利用修改原生對(duì)象的prototype來做語言擴(kuò)展,但我認(rèn)為應(yīng)當(dāng)小心地看待這件事,毫無疑問這將造成一定的命名污染,你無法保證框架的使用者或者與你的框架共存的其他框架不會(huì)使用同樣的名字來完成其他的事情。特別需要注意的是,Object和Array這兩個(gè)對(duì)象的prototype擴(kuò)展格外的危險(xiǎn),對(duì)Object來說,如果Object被修改,那么框架的使用者將無法創(chuàng)建一個(gè)未被修改的干凈的對(duì)象,這是一個(gè)致命的問題,尤其如果你的使用者喜歡用forin來反射一個(gè)對(duì)象的屬性。Array.prototype修改的危險(xiǎn)來自js一個(gè)不知有意還是無意的小小設(shè)計(jì),對(duì)原生的Array來說,任何情況下for和forin的遍歷結(jié)果是相同的,而因?yàn)闊o法控制自定義的屬性是不可枚舉的,任何Array.prototype的修改都會(huì)破壞這種特性。一方面,我認(rèn)為不應(yīng)當(dāng)推薦用forin遍歷數(shù)組,這其中包含著錯(cuò)誤的語義。另一方面,框架的設(shè)計(jì)者必須尊重這些使用者,因?yàn)閷?duì)于ECMA所定義的語法而言,它是正確的做法。其中包含著這樣一個(gè)簡(jiǎn)單的事實(shí):假如你的框架中修改了Array.prototype,那么一些之前能正確工作的代碼變得不可正確工作。

直接修改prototype看上去非常誘人,但是在考慮它之前應(yīng)當(dāng)先考慮兩種可能的方案:

(1)函數(shù)

提供一個(gè)以對(duì)象為第一個(gè)參數(shù)的函數(shù)比如 Array.prototype.each =

function ForEach(arr,f)

{

if(arr instanceof Array)/*...*/;

}

(2)繼承

以return的形式繼承一個(gè)內(nèi)置對(duì)象 比如考慮Array.prototype.each=

function ArrayCollection()

{

var r=Array.apply(this,arguments);

r.each=function(){/*......*/};

return r;

}

套用一句名言,不要修改原生對(duì)象的prototype,除非你認(rèn)為必要。不過修改原生對(duì)象的prototype確實(shí)有一些特殊的用途(就是"必要的情況"),主要體現(xiàn)在2點(diǎn):文字量支持和鏈?zhǔn)奖磉_(dá)。舉一個(gè)例子可以體現(xiàn)這兩點(diǎn):

var cf=function f(a,b,c,d)

{

/*........*/

}.$curry(3,4).$curry(5).$run();

如果希望實(shí)現(xiàn)類似上面的表達(dá)方式,可能就需要擴(kuò)展Function.prototype,權(quán)衡一下的話,如果你認(rèn)為命名污染的代價(jià)是值得的,那么也是可以提供給使用者的。

一個(gè)比較討巧的辦法是把選擇權(quán)利交給使用者,提供一個(gè)擴(kuò)展器:

function FunctionExtend()

{

this.$curry=function(){/*......*/};

this.$run=function(){/*......*/};

}

如果用戶喜歡可以FunctionExtend.apply(Function.prototype); 如果不喜歡擴(kuò)展 則可以

var r=function(){/*......*/};

FunctionExtend.apply(r);

3.保持和原生對(duì)象的一致

不知你有沒有注意到,內(nèi)置對(duì)象Function Array等都有這樣的性質(zhì):

new Function()跟Function的結(jié)果完全一致(String Number Boolean這種封裝型對(duì)象沒有這樣的性質(zhì))

如果框架中提供的類也具有這種性質(zhì),會(huì)是不錯(cuò)的選擇。這僅僅是一個(gè)例子,如果你注意到了其他細(xì)節(jié),并且讓框架中的類和原生對(duì)象保持一致,對(duì)使用者來說是非常有益的。

4.尊重語言 尊重用戶

編寫框架應(yīng)該尊重依賴的語言環(huán)境,在對(duì)原有的元素修改之前,首先應(yīng)該考慮到原來的合理性,任何語言的原生環(huán)境提供的都是經(jīng)過了精心設(shè)計(jì)的,在任何修改之前,至少應(yīng)該考慮這幾點(diǎn):效率、命名規(guī)范、必要性、與其他功能是否重復(fù)。如果你沒有付出至少跟語言的設(shè)計(jì)者相當(dāng)?shù)墓ぷ髁?,你的做法就是欠考慮的。

編寫框架也應(yīng)該尊重用戶的所有習(xí)慣,將編寫者的喜好強(qiáng)加給使用者并不是框架應(yīng)該做的事情??蚣軕?yīng)該保證大部分在沒有框架環(huán)境下能運(yùn)行的代碼都能在框架下正常工作,這樣用戶不必為了使用你的框架而修改原有的代碼。

5.規(guī)范命名和使用命名空間

減少命名污染可以讓你的框架跟其他框架更好地共存。很多框架使用了命名空間來管理,這是良好的設(shè)計(jì)。命名應(yīng)該是清晰且有實(shí)際意義的英文單詞,如前面3所述,為了保持和原生對(duì)象的一致,命名規(guī)則最好貼近原生對(duì)象,比如類名第一字母大寫,方法名用駝峰命名。捎帶一提prototype中的$實(shí)在是非常糟糕的設(shè)計(jì),無法想象$出現(xiàn)的目的僅僅是為了讓使用者少寫幾個(gè)字母。這種事情應(yīng)該交給你的用戶在局部代碼中使用


當(dāng)前題目:javascript笑話,關(guān)于編程的笑話
文章網(wǎng)址:http://weahome.cn/article/dsdphos.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部