作者: 李松峰
轉(zhuǎn)發(fā)鏈接:https://mp.weixin.qq.com/s/guAN1Cz2gYfKdBhmUpLyVA
前言
JAVAScript這門語言的第一個(gè)演示版差不多就在25年前誕生。
沒記錯(cuò)的話,25年前的今天,1995年5月10日,星期三,我剛剛過了創(chuàng)造JavaScript(代號(hào)為“Mocha”)的“5月的10天”沖刺的一半。我正在寫下個(gè)周一就要交付的一個(gè)演示,目的是展示JS與Netscape的深度瀏覽器集成(相對(duì)于Java小應(yīng)用)。
1995年秋天,這門語言在Netscape Navigator的一個(gè)測(cè)試版中發(fā)布,當(dāng)時(shí)叫LiveScript。那一年的年底,又被改名為JavaScript。也是在那一年,David Flanagan開始寫JavaScript: The Definitive Guide的第一版,并由O'Reilly在1996年8月出版。如今,24年過去了。
犀牛書(英文版)第7版再過幾個(gè)星期就要面世了。為此,David回憶了一下,想告訴大家有哪些JavaScript特性可以放心地忘掉。一個(gè)原因是第七版比第6版薄了不少。而這主要是因?yàn)橹暗暮芏鄸|西2020年的開發(fā)者已經(jīng)不用關(guān)心了。Web兼容性永遠(yuǎn)存在(至少25年以來一直如此),瀏覽器廠商可能在很長(zhǎng)時(shí)期內(nèi)仍然需要支持那些陳舊的、難以理解的語言和平臺(tái)特性。但對(duì)我們而言,已經(jīng)沒有必要再為這些特性分心了。
也就是說,有不少JavaScript和Web平臺(tái)特性在第7版里已經(jīng)銷聲匿跡了。應(yīng)該說,能對(duì)這些特性說再見是件高興的事。以下就是David憑記憶列出的幾個(gè)應(yīng)該忘記的特性。
arguments對(duì)象
arguments對(duì)象已經(jīng)被ES6的...args語法完全取代。要解釋清楚arguments與命名參數(shù)的關(guān)系,以及始終注意它對(duì)性能的影響著實(shí)不易。在遺留的前端代碼中,也許還會(huì)看到它的身影。在嚴(yán)格模式下如果想將局部變量或函數(shù)參數(shù)命名為arguments,那瀏覽器也會(huì)提醒你它的存在。不過現(xiàn)在有了剩余參數(shù),它就應(yīng)該悄悄地被人遺忘了。
拼接字符串
曾幾何時(shí),我們還會(huì)擔(dān)心重復(fù)拼接字符串導(dǎo)致的性能問題。有一段時(shí)間,大家都學(xué)會(huì)了先把字符串推到數(shù)組里,最后再使用join()把它們拼接起來。后來,JavaScript變快了,我們就把這個(gè)模式給忘了。而現(xiàn)在有了模板字面量,誰還會(huì)再拼接字符串呢?
document.write()
document.write()在很早以前,確切地說是在DOM問世之前,曾經(jīng)是JavaScript中最重要的特性。(如果你沒在20世紀(jì)寫過JavaScript,那可能想象不到DOM出現(xiàn)之前的日子,但那個(gè)時(shí)代真的存在過。)如果沒記錯(cuò)的話,人們甚至可以使用document.write()向文檔中插入腳本。不過這時(shí)候要小心,因?yàn)槟愕冒涯┪驳?lt;/script>標(biāo)簽拆成兩個(gè)字符串。這樣html解析器才不會(huì)把它解釋為當(dāng)前運(yùn)行腳本的結(jié)束標(biāo)簽。
frame 相關(guān)
HTML早期是沒有<iframe>的,不過有<frameset>和<frame>。window.frames屬性是一個(gè)數(shù)組,包含嵌套的window對(duì)象,表示文檔中的窗格。實(shí)際上,可以在窗格中調(diào)用文檔的open()方法,然后使用document.write()在該窗格中動(dòng)態(tài)生成整個(gè)文檔。不管怎么說,這還真有點(diǎn)酷。因?yàn)榇案窨梢郧短自谄渌案裰校總€(gè)window對(duì)象都有一個(gè)frames數(shù)組包含自己的子窗格、一個(gè)parent屬性引用包含窗口和一個(gè)top屬性引用頂級(jí)窗口。犀牛書的早期版本專門用了幾節(jié)篇幅和復(fù)雜的示意圖來解釋這些內(nèi)容。
直接引用特定元素相關(guān)
在文檔中直接引用特定元素的技術(shù)基本上都廢棄了。前面說到的frames數(shù)組是一個(gè),沒記錯(cuò)的話,還有l(wèi)inks和images數(shù)組,包含文檔中的所有鏈接和所有圖片。IE(我記得應(yīng)該是版本4)一步到位,引入了document.all,這是一個(gè)包含文檔中所有元素的數(shù)組。(這也是“DHTML”也就是“動(dòng)態(tài)HTML”及后來DOM的發(fā)端,有點(diǎn)像人類進(jìn)化史上第一條爬上陸地的魚。)document.all有各種各樣新奇的特性,它這個(gè)數(shù)組本身還有很多按名字或按其他條件來查詢?cè)氐姆椒āocument.all最終沒有被寫進(jìn)標(biāo)準(zhǔn),但即便是標(biāo)準(zhǔn)的document.getElementById()、document.getElementsByName()、document.getElementsByTagName()和docuemnt.getElementsByClassName()方法,在今天看來似乎也已經(jīng)沒多少人用了。因?yàn)槭艿搅薺Query的$()及受它啟發(fā)而引入標(biāo)準(zhǔn)的document.querySelector()和document.querySelectorAll()的排擠。借用css選擇符的威力,這兩個(gè)方法直接就把之前的那些方法都給廢掉了。
事件及其處理程序兼容
說起我最恨Internet Explorer的一件事,就是他們非要使用attachEvent()來注冊(cè)事件處理程序。在我的印象中,他們是在標(biāo)準(zhǔn)已經(jīng)規(guī)定了addEventListener()方法之后這么搞的,這可真是太討厭了。事件及其處理程序一直以來都是Web開發(fā)中一個(gè)最大的不兼容問題。多少年以來,JavaScript程序員(和JavaScript圖書作者)都必須處理IE事件模型與標(biāo)準(zhǔn)事件模型的各種差異。為此,處理事件的代碼必須寫兩遍,一遍針對(duì)IE,一遍針對(duì)Firefox。書中介紹事件的章節(jié)相應(yīng)地也會(huì)兩倍長(zhǎng),因?yàn)橛袃商追浅O嗨频珔s完全不兼容的事件處理機(jī)制。jQuery的一個(gè)主要特性就是實(shí)現(xiàn)了自己的事件兼容層,于是開發(fā)者只需掌握一種事件處理方式即可。我懷疑這也是它快速流行的一個(gè)重要原因。
DOM API 相關(guān)
最初的DOM API是在人們瘋狂迷戀XML的時(shí)代定義的。(當(dāng)時(shí)的人們確實(shí)相信用不了幾年,XML就可以解決所有數(shù)據(jù)問題。真是個(gè)難以置信的時(shí)代。)某種程度上,正是W3C的認(rèn)可,才讓Java那些人影響了DOM API,這些人覺得最好只定義一套API,JavaScript程序員能用它操作HTML文檔,而Java程序員能用它操作XML數(shù)據(jù)。這也是為什么會(huì)有Attr節(jié)點(diǎn)(最好當(dāng)它不存在)這么怪異的東西的原因。DOM Level 3 API中最讓我不理解的一個(gè)操作是從文檔中刪除元素e,你不能像今天這樣寫成e.remove(),而是必須寫成e.parentNode.removeChild(e)。
不管怎么說,現(xiàn)在都已經(jīng)2020年了。犀牛書第7版將不會(huì)再花筆墨描述這些陳舊的特性,這些特性大家最好還是忘掉。






