欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

javascript專家,JAVASCRIPT

《第三方JavaScript編程》epub下載在線閱讀全文,求百度網(wǎng)盤云資源

《第三方JavaScript編程》([美] Ben Vinegar)電子書網(wǎng)盤下載免費在線閱讀

成都創(chuàng)新互聯(lián)主營尚志網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,重慶APP開發(fā)公司,尚志h5微信小程序搭建,尚志網(wǎng)站營銷推廣歡迎尚志等地區(qū)企業(yè)咨詢

鏈接:

提取碼: qmx1

書名:第三方JavaScript編程

作者:[美] Ben Vinegar

譯者:郭凱

出版社:人民郵電出版社

出版年份:2015-9-1

頁數(shù):237

內(nèi)容簡介:

第三方JavaScript應用程序是自包含的應用組件,通常都是小腳本或插件,能夠為Web站點增加功能。它們往往是由獨立的組織或個人提供的,代碼和文件都是來自于遠程的Web地址。

《第三方JavaScript編程》由兩位第三方應用程序開發(fā)領域的專家編寫完成,通過豐富的示例和講解引導讀者掌握第三方Web開發(fā)的相關技術(shù)及如何開發(fā)運行在第三方環(huán)境的JavaScript代碼。《第三方JavaScript編程》共10章,分別介紹了第三方JavaScript的定義、如何加載和執(zhí)行代碼、DOM渲染、第三方腳本和數(shù)據(jù)服務器之間的通信、跨窗口的消息傳遞方法、身份驗證和cookie、第三方應用程序的安全性、JavaScript SDK的發(fā)展、性能、測試和調(diào)試。

《第三方JavaScript編程》并非JavaScript語言的初級讀本,適用于有一定第三方代碼開發(fā)經(jīng)驗的開發(fā)者以及致力于研究其如何在外部環(huán)境運行的開發(fā)者們閱讀。

作者簡介:

Ben Vinegar

Ben Vinegar 是 Disqus 的一名軟件工程師,Disqus 是一個第三方評論平臺,為超過 30 萬的博客、在線出版物以及其它Web網(wǎng)站提供服務,其中包括 CNN、連線雜志、每日電訊報和 IGN。Ben 在加入 Disqus 之前,在一個非常流行的 Web 記賬應用公司 FreshBooks 擔任軟件開發(fā)團隊的主管。

Anton Kovalyov

Anton Kovalyov 是 Disqus 的一名軟件工程師,在公司初期就曾主導 Disqus 評論微件的開發(fā)工作。他還參與一些 JavaScript 開源項目的開發(fā)與維護,包括代碼質(zhì)量工具 JSHint,和跨域通信的 JS 庫 easyXDM。

哪種物聯(lián)網(wǎng)編程語言最熱門

影響物聯(lián)網(wǎng)IoT實施的最主要因素之一是人才缺口:現(xiàn)有市場供應無法跟上擁有物聯(lián)網(wǎng)技術(shù)的工程師的需求。根據(jù)Canonical的研究,大約68%的公司正在努力為他們的物聯(lián)網(wǎng)項目雇傭開發(fā)人員。但技能短缺的另一面是,職業(yè)前景對于具有物聯(lián)網(wǎng)技術(shù)的專業(yè)人員來說是非常光明的。在這里,我們重點關注物聯(lián)網(wǎng)中最常用的編程語言,即Java,C,C ++,Python,JavaScript和Go,然后分析專門從事這些語言的專業(yè)人員可以獲得多少收入。我們還會考慮資歷和地點等因素。

作為一個技術(shù)強國,美國在IT 薪資標準方面常常成為世界其他國家的基準。以下是根據(jù)Payscale的數(shù)據(jù)對美國頂級物聯(lián)網(wǎng)IoT編程語言以及相應的開發(fā)者薪資數(shù)據(jù)的簡要統(tǒng)計。

美國最熱門的物聯(lián)網(wǎng)編程語言的平均工資統(tǒng)計

平均而言,Java和C開發(fā)人員可以獲得比物聯(lián)網(wǎng)中使用其他語言的開發(fā)人員更高的薪水,盡管高級Go編程人員的薪水潛力最高、盡管初級和中級Go開發(fā)人員與其他同行相比低調(diào),但Skilled Go的開發(fā)人員卻是業(yè)內(nèi)薪酬最高的開發(fā)人員之一。

從Java開始,我們來看看物聯(lián)網(wǎng)IoT中最流行的編程語言的平均薪水。

Java:物聯(lián)網(wǎng)技術(shù)最流行的編程語言

Java有多個應用領域,從后端編程到Android的移動應用。根據(jù) Eclipse基金會執(zhí)行的2017年物聯(lián)網(wǎng)開發(fā)者調(diào)查,Java首次提供了用于物聯(lián)網(wǎng)開發(fā)的編程語言列表,專門用于網(wǎng)關和云。

使用Java進行物聯(lián)網(wǎng)開發(fā)的一個主要好處是便攜性。Java沒有任何硬件限制,這意味著您可以在計算機上編寫和調(diào)試Java代碼,并將其部署到幾乎任何運行Java虛擬機的設備上。出于這個原因,許多公司選擇聘請Java開發(fā)人員進行物聯(lián)網(wǎng)項目。

根據(jù)Payscale的數(shù)據(jù),美國Java開發(fā)者的平均薪水約為8.8萬美元。瑞士的Java開發(fā)者的平均收入較高,每年約為96,000美元。與此同時,英國和以色列的Java開發(fā)人員的平均薪水則明顯較低,分別為4萬5千美元和33萬美元。

Java開發(fā)人員的平均工資

但是,Java開發(fā)人員的平均工資可能不具代表性,因為根據(jù)相關技術(shù)人員的經(jīng)驗和資歷,個人薪酬差別很大。例如,從Java初級到高級Java開發(fā)人員的薪酬跳躍在美國是6.6萬美元到97萬美元,在英國是從41,000美元到61,000美元。

Java在美國和英國的平均初級,中級和高級Java開發(fā)人員工資

我們對美國Java開發(fā)者工資的研究表明,不同州的平均薪水可能遠高于全國平均水平。例如,加利福尼亞州的開發(fā)人員對美國開發(fā)人員的平均薪水最高(13.3萬美元)。這一事實在很大程度上是該州IT總體高技能需求的一個功能。

C:嵌入式設備的關鍵編程語言

C編程語言接下來成為物聯(lián)網(wǎng)IoT堆棧最喜歡的語言。然而,根據(jù)Eclipse基金會的說法,它被認為是受限設備開發(fā)的領先技術(shù)。

該編程語言提供對低級硬件API的直接訪問。由于其與機器語言的相似性,C非常快速且靈活,使其成為處理能力有限的物聯(lián)網(wǎng)系統(tǒng)的完美選擇。

與Java類似,C開發(fā)人員的薪酬在世界各地差異很大。在美國,C開發(fā)人員每年可賺取約10萬美元,而在瑞士,C開發(fā)人員的平均年薪為92,000美元。在我們分析的國家中,C專家的最低工資在英國。據(jù)Payscale稱,英國年平均C開發(fā)人員薪水僅略高于4萬美元。

C開發(fā)人員的平均工資。來源:Payscale

C級初級和高級開發(fā)人員的薪酬差異也很大。高級C開發(fā)人員的收入幾乎是美國和英國入門級員工的兩倍。

C在美國和英國的初級,中級和高級C開發(fā)人員的平均工資

C ++:Linux的第一語言

與其前身C一樣,C ++已廣泛用于嵌入式系統(tǒng)開發(fā)。但是,C ++的主要優(yōu)勢在于處理能力,在任務更加復雜時使其成為C的有用替代方案。

C ++最適合編寫硬件特定的代碼。它可與Linux,第一大物聯(lián)網(wǎng)技術(shù)操作系統(tǒng)配合使用。但是,與Java相比,它具有有限的可移植性。

與C開發(fā)人員相比,C ++工程師的薪水更低。我們的研究發(fā)現(xiàn),C ++開發(fā)人員在以色列和丹麥的預計收入約為82-86,000美元,而在美國,這個數(shù)字僅為71,000美元。

平均C ++開發(fā)人員工資統(tǒng)計。來源:Payscale

然而,盡管美國的C ++開發(fā)人員平均費用較低,但經(jīng)驗豐富的專家在職業(yè)生涯后期可以達到六位數(shù)。

美國和英國的初級,中級和高級C ++開發(fā)人員的平均工資。

Python:面向數(shù)據(jù)的物聯(lián)網(wǎng)系統(tǒng)的解決方案

作為最受歡迎的網(wǎng)絡編程語言之一,以及科學計算的前沿技術(shù),Python在物聯(lián)網(wǎng)開發(fā)中也獲得了巨大的推動力。 對于數(shù)據(jù)密集型應用程序,Python是一個不錯的選擇,特別是在管理和組織復雜數(shù)據(jù)時。

此外,由于語言的清晰語法,用Python編寫的源代碼非常緊湊且非常易讀。這對于計算能力和內(nèi)存有限的小型設備來說效果特別好,盡管速度不如C / C ++快。

美國的平均Python開發(fā)人員薪水約在71k美元左右,而擁有類似技能的開發(fā)人員則分別在以色列和瑞士分別可以獲得約68-67k的薪水。

Python開發(fā)人員的平均工資。來源:Payscale

與其他一樣,初級和高級Python開發(fā)人員之間的薪酬差距很大。

美國和英國的平均初級,中級和高級Python開發(fā)人員薪水

仔細觀察數(shù)據(jù)顯示,盡管全國平均水平相對較低,但在美國,Python開發(fā)人員的薪水可能會非常高。由于開發(fā)商需求迫切,供應量有限,某些州的薪酬可能高達14萬美元。傳統(tǒng)上,加利福尼亞州是為技術(shù)專家提供最高工資的州之一。當?shù)氐腜ython開發(fā)人員平均賺取了大約13.5萬美元。

JavaScript:事件驅(qū)動物聯(lián)網(wǎng)應用的最佳解決方案

根據(jù)年度StackOverflow開發(fā)者調(diào)查顯示,JavaScript是過去五年來最流行的編程語言之一,是現(xiàn)代Web開發(fā)中的核心技術(shù)。

在許多其他應用領域中,JavaScript是物聯(lián)網(wǎng)編程語言中最常用的構(gòu)建事件驅(qū)動系統(tǒng)。它可以管理連接設備的大型網(wǎng)絡,并且在需要處理多個任務而無需等待其他任務完成時可以勝任。JavaScript對IoT的主要優(yōu)勢之一是非常節(jié)約資源。

隨著IBM和三星等主要公司在他們的物聯(lián)網(wǎng)項目中積極采用JavaScript(即Node.js),對具有物聯(lián)網(wǎng)(IoT)體驗的JavaScript開發(fā)人員的需求仍然很高。這意味著能夠全面的提高薪水。

瑞士的JavaScript開發(fā)者平均可以賺取約96k美元。令人驚訝的是,美國JavaScript專家的平均薪水要低得多,開發(fā)者可以得到6.9萬美元。

全球JavaScript開發(fā)人員的平均工資。來源:Payscale

不同州之間的薪資數(shù)據(jù)差別很大:例如,研究發(fā)現(xiàn),康涅狄格州,馬薩諸塞州,加利福尼亞州和紐約州是JavaScript開發(fā)者收入最高的美國州,平均薪資介于10萬美元至14萬美元之間。

同樣,根據(jù)經(jīng)驗,JavaScript開發(fā)人員的工資差別很大:美國的專業(yè)JavaScript開發(fā)人員平均可賺取10萬美元,英國則可賺取6萬美元左右。

美國和英國的平均初級,中級和高級JavaScript開發(fā)人員工資

Go:堅固的技術(shù)堆棧為復雜的物聯(lián)網(wǎng)網(wǎng)絡提供動力

Go是一款開源編程語言,由Google創(chuàng)建。盡管它不能像語言那樣擁有同樣廣泛的用途,但我們之前專注于這一點,它是在您的物聯(lián)網(wǎng)系統(tǒng)內(nèi)建立通信層的強大技術(shù)。

Go語言關于物聯(lián)網(wǎng)的主要優(yōu)勢是并發(fā)性和同時運行多個進程(數(shù)據(jù)輸入和輸出)的能力。這使得構(gòu)建由多個傳感器和設備組成的復雜IoT網(wǎng)絡變得更加容易。

雖然它已被評為美國最高收入技術(shù)(根據(jù)最新的StackOverflow開發(fā)者調(diào)查),但美國的Go平均薪水相當平穩(wěn) - 約為73,000美元,而英國則為43,000美元。

根據(jù)最近的調(diào)查顯示,由于全球Go開發(fā)者工資數(shù)據(jù)不足,我們將重點關注美國和英國這些Go開發(fā)者人數(shù)最多的國家的薪水。

在美國和英國的平均Go開發(fā)者工資。來源:Payscale

高技能的Go開發(fā)者在美國可以獲得高達14萬美元的收入 - 幾乎是初級Go程序員的三倍,是英國高級Go開發(fā)者的兩倍。

在美國和英國的平均初級,中級和高級Go開發(fā)人員工資

結(jié)論

正如我們所看到的,物聯(lián)網(wǎng)中最熱門編程語言的開發(fā)人員的工資差別很大,并且取決于許多關鍵方面。為了理解這些信息,重要的是要看到更大的空間,并能夠識別現(xiàn)有的市場趨勢。

以上由物聯(lián)傳媒提供,如有侵權(quán)聯(lián)系刪除

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

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

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

1.語言擴展

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

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

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

3.DOM擴展

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

4.AJAX擴展

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

5.效果

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

7.腳本管理

因為大家非常喜歡C++風格的include或者JAVA風格的import,很多框架提供了基于AJAX的腳本管理,不過同步加載的效率問題是巨大的。之前我們曾經(jīng)作過各種嘗試,希望找到一個瀏覽器中不用XMLHTTP加載外部js的方法,但是最后得出的結(jié)論是:不可能。

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

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

8.控件

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

框架設計的若干原則:

1.不要做多余的事

對這框架設計來說,我認為一個非常必要的原則就是不要做多余的事情,舉個極端的的例子:

function add(a,b)

{

return a+b;

}

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

Array.prototype.clone=function(){

return this.slice();

}

2.慎用prototype擴展

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

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

(1)函數(shù)

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

function ForEach(arr,f)

{

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

}

(2)繼承

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

function ArrayCollection()

{

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

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

return r;

}

套用一句名言,不要修改原生對象的prototype,除非你認為必要。不過修改原生對象的prototype確實有一些特殊的用途(就是"必要的情況"),主要體現(xiàn)在2點:文字量支持和鏈式表達。舉一個例子可以體現(xiàn)這兩點:

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

{

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

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

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

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

function FunctionExtend()

{

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

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

}

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

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

FunctionExtend.apply(r);

3.保持和原生對象的一致

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

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

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

4.尊重語言 尊重用戶

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

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

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

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

JavaScript清除歷史記錄的一點問題

1.不要做任何假設

(JavaScript是一個不可靠的助手)

可能不唐突的JavaScript 的最重要的一個特性就是——你要停止任何假設:

* 不要假設JavaScript是可用的,你最好認為它很有可能是不可用的,而不是直接依賴于它。

* 在你經(jīng)過測試確認一些方法和屬性可以使用之前,不要假設瀏覽器支持它們。

* 不要假設HTML代碼如你想象的那樣正確,每次都要進行檢查,并且當其不可用的時候就什么也不要做。

* 讓JavaScript的功能獨立于輸入設備

* 要記住其他的腳本可能會影響你的JavaScript的功能,所以要保證你的腳本的作用域盡可能地安全。

在開始設計你的腳本之前,要考慮的第一件事情就是檢查一下你要為其編寫腳本的HTML代碼,看看有什么東西可以幫助你達到目的。

2.找出鉤子和節(jié)點關系

(HTML是腳本的基石)

在開始編寫腳本之前,要先看一下你要為之編寫JavaScript的HTML。如果HTML是未經(jīng)組織的或者未知的,那么你幾乎不可能有一個好的腳本編寫方案——很可能就會出現(xiàn)下面的情況:要么是會用JavaScript創(chuàng)建太多標記,要么就是應用太依賴于JavaScript。

在HTML中有一些東西需要考慮,那就是鉤子和節(jié)點關系。

1.HTML 鉤子

HTML最初的和最重要的鉤子就是ID,而且ID可以通過最快的DOM方法——getElementById 訪問到。如果在一個有效的HTML文檔中所有的ID都是獨一無二的話(在IE中關于name 和 ID 有一個bug,不過有些好的類庫解決了這個問題),使用ID就是安全可靠的,并且易于測試。

其他一些鉤子就是是HTML元素和CSS類,HTML元素可以通過getElementsByTagName方法訪問,而在多數(shù)瀏覽器中都還不能通過原生的DOM方法來訪問CSS類。不過,有很多外部類庫提供了可以訪問CSS類名(類似于 getElementsByClassName) 的方法。

2.HTML 節(jié)點關系

關于HTML的另外比較有意思的一點就是標記之間的關系,思考下面的問題:

* 要怎樣才可以最容易地、通過最少的DOM遍歷來到達目標節(jié)點?

* 通過修改什么標記,可以盡可能多地訪問到需要修改的子節(jié)點?

* 一個給定的元素有什么屬性或信息可以用來到達另外一個元素?

遍歷DOM很耗資源而且速度很慢,這就是為什么要盡量使用瀏覽器中已經(jīng)在使用的技術(shù)來做這件事情。

3.把遍歷交給專家來做

(CSS,更快地遍歷DOM)

有關DOM的腳本和使用方法或?qū)傩裕╣etElementsByTagName, nextSibling, previousSibling, parentNode以及其它)來遍歷DOM似乎迷惑了很多人,這點很有意思。而有趣的是,我們其實早已經(jīng)通過另外一種技術(shù)—— CSS ——做了這些事情。

CSS 是這樣一種技術(shù),它使用CSS選擇器,通過遍歷DOM來訪問目標元素并改變它們的視覺屬性。一段復雜的使用DOM的JavaScript可以用一個CSS選擇器取代:

Java代碼 var n = document.getElementById('nav'); if(n){ var as = n.getElementsByTagName('a'); if(as.length 0){ for(var i=0;as[i];i++){ as[i].style.color = ‘#369′; as[i].style.textDecoration = ‘none’; } } } /* 下面的代碼與上面功能一樣 */ #nav a{ color:#369; text-decoration:none; } var n = document.getElementById('nav'); if(n){ var as = n.getElementsByTagName('a'); if(as.length 0){ for(var i=0;as[i];i++){ as[i].style.color = ‘#369′; as[i].style.textDecoration = ‘none’; } } } /* 下面的代碼與上面功能一樣 */ #nav a{ color:#369; text-decoration:none; }

這是一個可以好好利用的很強大的技巧。你可以通過動態(tài)為DOM中高層的元素添加class 或者更改元素ID來實現(xiàn)這一點。如果你使用DOM為文檔的body添加了一個CSS類,那么設計師就很可以容易地定義文檔的靜態(tài)版本和動態(tài)版本。

Java代碼 JavaScript: var dynamicClass = 'js'; var b = document.body; b.className = b.className ? b.className + ' js' : 'js'; CSS: /* 靜態(tài)版本 */ #nav { .... } /* 動態(tài)版本 */ body.js #nav { .... } JavaScript: var dynamicClass = 'js'; var b = document.body; b.className = b.className ? b.className + ' js' : 'js'; CSS: /* 靜態(tài)版本 */ #nav { .... } /* 動態(tài)版本 */ body.js #nav { .... }

4.理解瀏覽器和用戶

(在既有的使用模式上創(chuàng)建你所需要的東西)

不唐突的JavaScript 中很重要的一部分就是理解瀏覽器是如何工作的(尤其是瀏覽器是如何崩潰的)以及用戶期望的是什么。不考慮瀏覽器你也可以很容易地使用JavaScript 創(chuàng)建一個完全不同的界面。拖拽界面,折疊區(qū)域,滾動條和滑動塊都可以使用JavaScript創(chuàng)建,但是這個問題并不是個簡單的技術(shù)問題,你需要思考下面的問題:

* 這個新界面可以獨立于輸入設備么?如果不能,那么可以依賴哪些東西?

* 我創(chuàng)建的這個新界面是否遵循了瀏覽器或者其它富界面的準則(你可以通過鼠標在多級菜單中直接切換嗎?還是需要使用tab鍵?)

* 我需要提供什么功能但是這個功能是依賴于JavaScript的?

最后一個問題其實不是問題,因為如果需要你就可以使用DOM來憑空創(chuàng)建HTML。關于這點的一個例子就是“打印”鏈接,由于瀏覽器沒有提供一個非 JavaScript的打印文檔功能,所以你需要使用DOM來創(chuàng)建這類鏈接。同樣地,一個實現(xiàn)了展開和收縮內(nèi)容模塊的、可以點擊的標題欄也屬于這種情況。標題欄不能被鍵盤激活,但是鏈接可以。所以為了創(chuàng)建一個可以點擊的標題欄你需要使用JavaScript將鏈接加入進去,然后所有使用鍵盤的用戶就可以收縮和展開內(nèi)容模塊了。

解決這類問題的極好的資源就是設計模式庫。至于要知道瀏覽器中的哪些東西是獨立于輸入設備的,那就要靠經(jīng)驗的積累了。首先你要理解的就是事件處理機制。

5.理解事件

(事件處理會引起改變)

事件處理是走向不唐突的JavaScript的第二步。重點不是讓所有的東西都變得可以拖拽、可以點擊或者為它們添加內(nèi)聯(lián)處理,而是理解事件處理是一個可以完全分離出來的東西。我們已經(jīng)將HTML,CSS和JavaScript分離開來,但是在事件處理的分離方面卻沒有走得很遠。

事件處理器會監(jiān)聽發(fā)生在文檔中元素上的變化,如果有事件發(fā)生,處理器就會找到一個很奇妙的對象(一般會是一個名為e的參數(shù)),這個對象會告訴元素發(fā)生了什么以及可以用它做什么。

對于大多數(shù)事件處理來說,真正有趣的是它不止發(fā)生在你想要訪問的元素上,還會在DOM中較高層級的所有元素上發(fā)生(但是并不是所有的事件都是這樣,focus和blur事件是例外)。舉例來說,利用這個特性你可以為一個導航列表只添加一個事件處理器,并且使用事件處理器的方法來獲取真正觸發(fā)事件的元素。這種技術(shù)叫做事件委托,它有幾點好處:

* 你只需要檢查一個元素是否存在,而不需要檢查每個元素

* 你可以動態(tài)地添加或者刪除子節(jié)點而并不需要刪除相應的事件處理器

* 你可以在不同的元素上對相同的事件做出響應

需要記住的另一件事是,在事件向父元素傳播的時候你可以停止它而且你可以覆寫掉HTML元素(比如鏈接)的缺省行為。不過,有時候這并不是個好主意,因為瀏覽器賦予HTML元素那些行為是有原因的。舉個例子,鏈接可能會指向頁面內(nèi)的某個目標,不去修改它們能確保用戶可以將頁面當前的腳本狀態(tài)也加入書簽。

6.為他人著想

(命名空間,作用域和模式)

你的代碼幾乎從來不會是文檔中的唯一的腳本代碼。所以保證你的代碼里沒有其它腳本可以覆蓋的全局函數(shù)或者全局變量就顯得尤為重要。有一些可用的模式可以來避免這個問題,最基礎的一點就是要使用 var 關鍵字來初始化所有的變量。假設我們編寫了下面的腳本:

Java代碼 var nav = document.getElementById('nav'); function init(){ // do stuff } function show(){ // do stuff } function reset(){ // do stuff } var nav = document.getElementById('nav'); function init(){ // do stuff } function show(){ // do stuff } function reset(){ // do stuff }

上面的代碼中包含了一個叫做nav的全局變量和名字分別為 init,show 和 reset 的三個函數(shù)。這些函數(shù)都可以訪問到nav這個變量并且可以通過函數(shù)名互相訪問:

Java代碼 var nav = document.getElementById('nav'); function init(){ show(); if(nav.className === 'show'){ reset(); } // do stuff } function show(){ var c = nav.className; // do stuff } function reset(){ // do stuff } var nav = document.getElementById('nav'); function init(){ show(); if(nav.className === 'show'){ reset(); } // do stuff } function show(){ var c = nav.className; // do stuff } function reset(){ // do stuff }

你可以將代碼封裝到一個對象中來避免上面的那種全局式編碼,這樣就可以將函數(shù)變成對象中的方法,將全局變量變成對象中的屬性。 你需要使用“名字+冒號”的方式來定義方法和屬性,并且需要在每個屬性或方法后面加上逗號作為分割符。

Java代碼 var myScript = { nav:document.getElementById('nav'), init:function(){ // do stuff }, show:function(){ // do stuff }, reset:function(){ // do stuff } } var myScript = { nav:document.getElementById('nav'), init:function(){ // do stuff }, show:function(){ // do stuff }, reset:function(){ // do stuff } }

所有的方法和屬性都可以通過使用“類名+點操作符”的方式從外部和內(nèi)部訪問到。

Java代碼 var myScript = { nav:document.getElementById('nav'), init:function(){ myScript.show(); if(myScript.nav.className === 'show'){ myScript.reset(); } // do stuff }, show:function(){ var c = myScript.nav.className; // do stuff }, reset:function(){ // do stuff } } var myScript = { nav:document.getElementById('nav'), init:function(){ myScript.show(); if(myScript.nav.className === 'show'){ myScript.reset(); } // do stuff }, show:function(){ var c = myScript.nav.className; // do stuff }, reset:function(){ // do stuff } }

這種模式的缺點就是,你每次從一個方法中訪問其它方法或?qū)傩远急仨氃谇懊婕由蠈ο蟮拿郑覍ο笾械乃袞|西都是可以從外部訪問的。如果你只是想要部分代碼可以被文檔中的其他腳本訪問,可以考慮下面的模塊(module)模式:

Java代碼 var myScript = function(){ //這些都是私有方法和屬性 var nav = document.getElementById('nav'); function init(){ // do stuff } function show(){ // do stuff } function reset(){ // do stuff } //公有的方法和屬性被使用對象語法包裝在return 語句里面 return { public:function(){ }, foo:'bar' } }(); var myScript = function(){ //這些都是私有方法和屬性 var nav = document.getElementById('nav'); function init(){ // do stuff } function show(){ // do stuff } function reset(){ // do stuff } //公有的方法和屬性被使用對象語法包裝在return 語句里面 return { public:function(){ }, foo:'bar' } }();

你可以使用和前面的代碼同樣的方式訪問返回的公有的屬性和方法,在本示例中可以這么訪問:myScript.public() 和 myScript.foo 。但是這里還有一點讓人覺得不舒服:當你想要從外部或者從內(nèi)部的一個私有方法中訪問公有方法的時候,還是要寫一個冗長的名字(對象的名字可以非常長)。為了避免這一點,你需要將它們定義為私有的并且在return語句中只返回一個別名:

Java代碼 var myScript = function(){ // 這些都是私有方法和屬性 var nav = document.getElementById('nav'); function init(){ // do stuff } function show(){ // do stuff // do stuff } function reset(){ // do stuff } var foo = 'bar'; function public(){ } var myScript = function(){ // 這些都是私有方法和屬性 var nav = document.getElementById('nav'); function init(){ // do stuff } function show(){ // do stuff // do stuff } function reset(){ // do stuff } var foo = 'bar'; function public(){ }

//只返回指向那些你想要訪問的私有方法和屬性的指針

Java代碼 return { public:public, foo:foo } }(); return { public:public, foo:foo } }();

這就保證了代碼風格一致性,并且你可以使用短一點的別名來訪問其中的方法或?qū)傩浴?/p>

如果你不想對外部暴露任何的方法或?qū)傩裕憧梢詫⑺械拇a封裝到一個匿名方法中,并在它的定義結(jié)束后立刻執(zhí)行它:

Java代碼 (function(){ // these are all private methods and properties var nav = document.getElementById('nav'); function init(){ // do stuff show(); // 這里不需要類名前綴 } function show(){ // do stuff } function reset(){ // do stuff } })(); (function(){ // these are all private methods and properties var nav = document.getElementById('nav'); function init(){ // do stuff show(); // 這里不需要類名前綴 } function show(){ // do stuff } function reset(){ // do stuff } })();

對于那些只執(zhí)行一次并且對其它函數(shù)沒有依賴的代碼模塊來說,這種模式非常好。

通過遵循上面的那些規(guī)則,你的代碼更好地為用戶工作,也可以使你的代碼在機器上更好地運行并與其他開發(fā)者的代碼和睦相處。不過,還有一個群體需要考慮到。

7.為接手的開發(fā)者考慮

(使維護更加容易)

使你的腳本真正地unobtrusive的最后一步是在編寫完代碼之后仔細檢查一遍,并且要照顧到一旦腳本上線之后要接手你的代碼的開發(fā)者。考慮下面的問題:

* 所有的變量和函數(shù)名字是否合理并且易于理解?

* 代碼是否經(jīng)過了合理的組織?從頭到尾都很流暢嗎?

* 所有的依賴都顯而易見嗎?

* 在那些可能引起混淆的地方都添加了注釋嗎?

最重要的一點是:要認識到文檔中的HTML和CSS代碼相對于JavaScript來說更有可能被改變(因為它們負責視覺效果)。所以不要在腳本代碼中包含任何可以讓終端用戶看到的class和ID,而是要將它們分離出來放到一個保存配置信息的對象中。

Java代碼 myscript = function(){ var config = { navigationID:'nav', visibleClass:'show' }; var nav = document.getElementById(config.navigationID); function init(){ show(); if(nav.className === config.visibleClass){ reset(); }; // do stuff }; function show(){ var c = nav.className; // do stuff }; function reset(){ // do stuff }; }(); myscript = function(){ var config = { navigationID:'nav', visibleClass:'show' }; var nav = document.getElementById(config.navigationID); function init(){ show(); if(nav.className === config.visibleClass){ reset(); }; // do stuff }; function show(){ var c = nav.className; // do stuff }; function reset(){ // do stuff }; }();

這樣維護者就知道去哪里修改這些屬性,而不需要改動其他代碼。

在js中事件和事件屬性各指的是什么?二者有何區(qū)別?

事件:

是js中特有的東西。js就是基于事件驅(qū)動的一門語言。

想一下js的實現(xiàn),都(大多數(shù))是通過用戶與瀏覽器的交互,比如你點擊某個控件,鼠標放上,ajax請求等等,你的這些操作其實都是觸發(fā)了js中定義的具體的事件,你可以給具體的事件綁定處理事件的函數(shù)。

我們常用的事件有:click,mouseover,mouseout等等。

事件屬性:

表示的是具體的事件的一些特性,這些屬性是讓你更好的去控制這個事件,比如點擊事件有屬性可以判斷點擊的位置,點擊時候是不是按下了哪個鍵盤按鍵,點擊是鼠標左鍵還是鼠標右鍵。

關于事件的一些知識,強烈建議你去看下《javascript權(quán)威指南》,里面對事件,事件屬性,事件目標,事件觸發(fā)等等各種含義都解釋的相當?shù)轿唬嘈拍憧戳艘欢ㄓ袔椭?/p>

同時很希望幫到你,看到下面專家的回答,我壓力還是蠻大的,真心希望我的回答能解決你的問題。

分享標題:javascript專家,JAVASCRIPT
瀏覽路徑:http://chinadenli.net/article18/dsgpcgp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設計公司網(wǎng)站改版網(wǎng)站建設靜態(tài)網(wǎng)站手機網(wǎng)站建設網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站