初識(shí)JavaScript
譯者:張帆
JavaScript有何特別之處?我們可以用它來(lái)實(shí)現(xiàn)什么赘阀?有哪些其他技術(shù)也能發(fā)揮很好它的作用?脑奠,讓我們來(lái)一探究竟基公。
JavaScript是什么?
JavaScript一開(kāi)始設(shè)計(jì)出來(lái)的初衷是“使網(wǎng)頁(yè)更加生動(dòng)”宋欺。
JavaScript里的程序稱為腳本轰豆,腳本可以寫(xiě)在HTML里,并且當(dāng)頁(yè)面加載時(shí)會(huì)自動(dòng)執(zhí)行齿诞。腳本被提供并且可以作為純文本來(lái)執(zhí)行秒咨。它們不需要一個(gè)特別的準(zhǔn)備或者編譯器來(lái)運(yùn)行,從這方面說(shuō)掌挚,JavaScript與另一個(gè)叫Java的編程語(yǔ)言有著巨大的差異雨席。
為什么會(huì)被稱為JavaScript?
當(dāng)JavaScript最初被設(shè)計(jì)出來(lái)的時(shí)候吠式, 有另一個(gè)名字:“LiveScript”陡厘。但當(dāng)時(shí)Java十分流行,因此特占,將JavaScript這一新的語(yǔ)言定位為Java的“小兄弟”將會(huì)有助于其發(fā)展糙置。
隨著JavaScript的不斷發(fā)展,它已經(jīng)變成一個(gè)完全獨(dú)立的編程語(yǔ)言是目,它有自己的 ECMAScript文檔谤饭,而且和java再無(wú)任何關(guān)系了。
如今懊纳,JavaScript不僅可以在瀏覽器里運(yùn)行揉抵,而且還可以在服務(wù)器端運(yùn)行,或者說(shuō)只要有JavaScript引擎嗤疯,任何設(shè)備都可以運(yùn)行JavaScript冤今。瀏覽器中都內(nèi)嵌了一個(gè)JavaScript引擎,有時(shí)候我們稱它為“JavaScript虛擬機(jī)”茂缚。
不同的引擎會(huì)有不同的內(nèi)核名稱戏罢,比如:
- V8——在Chrome和Opera中使用
- Gecko——在Firefox瀏覽器中使用
- 還有一些其他的類似于不同版本IE瀏覽器使用的“Trident”、“Chakra”脚囊,Microsoft Edge使用的“ChakraCore”龟糕, safari使用的“Nitro”和“SquirrelFish”等等。
以上內(nèi)容很好記悔耘,因?yàn)槲覀兘?jīng)常在網(wǎng)絡(luò)開(kāi)發(fā)者的文章中可以看到它們讲岁,而且我們也會(huì)用到這些,比如:V8支持X功能,那么很可能這個(gè)功能能夠在Chrome和Opera中應(yīng)用催首。
JavaScript引擎是如何工作的?
JavaScript引擎工作細(xì)節(jié)很復(fù)雜泄鹏,但基礎(chǔ)原理很簡(jiǎn)單郎任。
- 腳本以純文本的形式被編寫(xiě)和分發(fā)(可以通過(guò)“javascript minifiers”工具進(jìn)行壓縮和優(yōu)化)
- JavaScript引擎(如果是瀏覽器的話,指內(nèi)嵌引擎)會(huì)先解析腳本备籽,然后編譯成計(jì)算機(jī)語(yǔ)言
- 最后運(yùn)行腳本舶治,而且速度很快
引擎在執(zhí)行過(guò)程的每個(gè)階段都會(huì)進(jìn)行優(yōu)化,它甚至可以在運(yùn)行的時(shí)候監(jiān)控腳本车猬,分析經(jīng)過(guò)它的數(shù)據(jù)霉猛,并根據(jù)這些知識(shí)對(duì)機(jī)器代碼進(jìn)行優(yōu)化。這就是代碼運(yùn)行如此之快的原因珠闰。
瀏覽器內(nèi)嵌的JavaScript能做什么惜浅?
如今的JavaScript是一個(gè)“安全”的編程語(yǔ)言,它不提供對(duì)內(nèi)存和CPU的低級(jí)訪問(wèn)伏嗜,因?yàn)樗婚_(kāi)始就是為那些并不需要這些的瀏覽器設(shè)計(jì)的坛悉。它的能力很大程度上依賴于運(yùn)行JavaScript的環(huán)境。例如承绸,Node.JS支持JavaScript讀取/寫(xiě)入任意文件裸影,執(zhí)行網(wǎng)絡(luò)請(qǐng)求等等。瀏覽器的JavaScript能夠處理與網(wǎng)頁(yè)操作军熏,和用戶以及服務(wù)器后端交互的任何事情轩猩。
比如,瀏覽器的JavaScript可以處理:
- 在頁(yè)面新建一個(gè)HTML荡澎,修改已有內(nèi)容和樣式
- 根據(jù)用戶操作做出反應(yīng)均践,如鼠標(biāo)點(diǎn)擊、指針移動(dòng)以及按鍵操作
- 向遠(yuǎn)程服務(wù)器發(fā)送網(wǎng)絡(luò)請(qǐng)求摩幔,下載和上傳文件(就是我們所說(shuō)的“AJAX”和“COMET”技術(shù))
- 獲取并設(shè)置cookies浊猾,向訪問(wèn)者提問(wèn),顯示信息
- 記錄瀏覽器端的數(shù)據(jù)(“本地存儲(chǔ)”)
瀏覽器內(nèi)嵌的JavaScript還不能做什么热鞍?
瀏覽器中的JavaScript能力因考慮用戶的安全原因而受到限制葫慎,它目的是防止惡意網(wǎng)頁(yè)訪問(wèn)私人信息或損害用戶的數(shù)據(jù)。
比如以下受限制的例子:
- 網(wǎng)頁(yè)中的JavaScript可能沒(méi)辦法讀取/寫(xiě)入硬盤(pán)上的任意文件薇宠,沒(méi)辦法復(fù)制偷办、執(zhí)行程序,它沒(méi)有直接訪問(wèn)操作系統(tǒng)的功能
現(xiàn)代瀏覽器允許JavaScript對(duì)文件進(jìn)行操作澄港,但是這種訪問(wèn)是有限的椒涯,并且是在用戶進(jìn)行某些操作后才會(huì)提供,例如在瀏覽器窗口“刪除”文件或者是通過(guò)<input>
標(biāo)簽來(lái)選擇文件回梧。
有一些方法可以與攝像頭/麥克風(fēng)和其他設(shè)備進(jìn)行交互废岂,但是需要用戶明確的許可祖搓,所以一個(gè)支持JavaScript的網(wǎng)頁(yè)可能沒(méi)辦法偷偷地調(diào)用攝像頭觀察周圍的環(huán)境并把信息送給國(guó)家安全局。 - 不同的窗口一般來(lái)說(shuō)是互不相干的湖苞,有時(shí)候會(huì)有聯(lián)系拯欧,比如一個(gè)窗口用JavaScript打開(kāi)另一個(gè)窗口,但在這種情況下财骨,如果它們來(lái)自不同的站點(diǎn)(來(lái)自不同的域镐作、協(xié)議或端口),就算來(lái)自一個(gè)頁(yè)面的JavaScript也可能無(wú)法訪問(wèn)其他頁(yè)面隆箩。這被稱為“同源策略”该贾。為了解決這個(gè)問(wèn)題,這兩個(gè)頁(yè)面必須包含一個(gè)處理數(shù)據(jù)交換的特殊JavaScript代碼捌臊。
對(duì)用戶的安全來(lái)說(shuō)杨蛋,這又是一個(gè)限制,一個(gè)用戶偶爾打開(kāi)的http://anysite.com 的頁(yè)面不能打開(kāi)或訪問(wèn)另一個(gè)網(wǎng)址為 http://gmail.com 瀏覽器窗口理澎,也無(wú)法從那里竊取信息六荒。 - JavaScript可以輕松地通過(guò)網(wǎng)絡(luò)與當(dāng)前頁(yè)面來(lái)自的服務(wù)器進(jìn)行通信,但是它從其他站點(diǎn)/域名接收數(shù)據(jù)的能力受到了削弱矾端,雖然有這個(gè)可能掏击,但需要從遠(yuǎn)程服務(wù)器獲取明確的協(xié)議(在HTTP頭信息顯示),但這也是安全限制秩铆。
如果JavaScript在瀏覽器之外比如服務(wù)器端運(yùn)行砚亭,這么多限制就不存在了,現(xiàn)代瀏覽器允許安裝擴(kuò)展插件殴玛,這樣可能會(huì)獲取更多的權(quán)限捅膘。
什么使得JavaScript如此不同?
關(guān)于JavaScript滚粟,至少有三件很棒的事情:
- 與HTML/CSS完全集成
- 簡(jiǎn)單的事情簡(jiǎn)單做
- 被所有主流瀏覽器支持并默認(rèn)啟用
以上寻仗,只存在JavaScript中并沒(méi)有其他的瀏覽器技術(shù)。
這就是JavaScript如此不同的原因凡壤,這也是為什么JavaScript是目前創(chuàng)建瀏覽器交互界面使用最廣泛的工具署尤。
當(dāng)我們準(zhǔn)備學(xué)習(xí)一項(xiàng)新技術(shù)的時(shí)候,最好去觀望一下它的未來(lái)亚侠,所以曹体,讓我們來(lái)看看包括新語(yǔ)言和瀏覽器能力在內(nèi)的現(xiàn)代趨勢(shì)。
JavaScript之外的語(yǔ)言
JavaScript的語(yǔ)法并不符合每個(gè)人的需求硝烂,不同的人希望有不同的功能細(xì)節(jié)箕别。這很正常,因?yàn)轫?xiàng)目和需求對(duì)每個(gè)人來(lái)說(shuō)都是不同的。所以串稀,最近有很多新的語(yǔ)言如雨后春筍般冒出來(lái)除抛,瀏覽器在運(yùn)行他們之前會(huì)先將它們轉(zhuǎn)化成JavaScript。
現(xiàn)代工具能夠使這種轉(zhuǎn)化非衬附兀快捷和透明到忽,這實(shí)際上允許開(kāi)發(fā)者使用另一種編程語(yǔ)言去編碼,然后它會(huì)自動(dòng)進(jìn)行轉(zhuǎn)化微酬。
這里是一些類似于這種語(yǔ)言的例子:
- CoffeeScript 相對(duì)JavaScript來(lái)說(shuō)绘趋,像是“語(yǔ)法糖果”颤陶,它使用更簡(jiǎn)短的語(yǔ)法颗管,允許使用更加精確清晰的代碼,通常使用Ruby的人會(huì)喜歡它滓走。
- TypeScript專注于添加“嚴(yán)格的數(shù)據(jù)輸入”垦江,以簡(jiǎn)化復(fù)雜系統(tǒng)的開(kāi)發(fā)和支持。它是由微軟開(kāi)發(fā)的搅方。
- Dart 是一個(gè)獨(dú)立的語(yǔ)言比吭,它有自己的引擎,通常在非瀏覽器環(huán)境中運(yùn)行(比如移動(dòng)app)姨涡,它最初是由谷歌提供的衩藤,作為JavaScript的替代品,但是現(xiàn)在涛漂,瀏覽器需要將它轉(zhuǎn)換成JavaScript赏表,就像上面的一樣。
還有更多其他的語(yǔ)言匈仗,當(dāng)然瓢剿,即使我們使用其中一種語(yǔ)言,我們也應(yīng)該了解JavaScript來(lái)真正理解我們?cè)谧鍪裁础?/p>
總結(jié)
- JavaScript最初被創(chuàng)建為一種基于瀏覽器的語(yǔ)言悠轩,但是現(xiàn)在它也被用于許多其他的環(huán)境中间狂。
- 如今,JavaScript有一個(gè)獨(dú)特的地位火架,它是一種被廣泛采用的瀏覽器語(yǔ)言鉴象,與HTML / CSS完全集成。
- 有很多語(yǔ)言可以“轉(zhuǎn)換”到JavaScript并提供某些特性何鸡。在掌握了JavaScript之后炼列,建議至少簡(jiǎn)要地看一下它們。