你不知道的js(中卷)附錄A 混合環(huán)境JavaScript

??????如果JavaScript程序僅僅是在引擎中運行的話被啼,它會嚴格遵循規(guī)范并且是可以預(yù)測的郑叠。但是JavaScript程序幾乎總是在宿主環(huán)境中運行秋泳,這使得它在一定程度上變得不可預(yù)測。例如倡缠,當你的代碼和其他第三方代碼一起運行哨免,或者當你的代碼在不同的JavaScript引擎(并非僅僅是瀏覽器)上運行時,有些地方就會出現(xiàn)差異昙沦。

1. Annex B(ECMAScript)

??????文檔“Annex B”和“WebECMAScript”舰始,記錄了一些官方ECMAScript規(guī)范和目前基于瀏覽器的JavaScript實現(xiàn)之間的差異炕吸。
??????比如:window.escape(..)和window.unescape(..)就不是ECMAScript官方標準里有的。瀏覽器JavaScript里有,但其它非瀏覽器的JavaScript引擎里很可能沒有哆档。


2. 宿主對象

??????JavaScript中有關(guān)變量的規(guī)則定義得十分清楚,但也不乏一些例外情況彭羹,比如自動定義的變量奕筐,以及由宿主環(huán)境(瀏覽器等)創(chuàng)建并提供給JavaScript引擎的變量——所謂的“宿主對象”。
??????宿主對象可能的行為差異:
??????①無法訪問正常的object內(nèi)建方法徘钥,如toString()
??????②無法寫覆蓋
??????③包含一些預(yù)定義的只讀屬性
??????④包含無法將this重載為其他對象的方法

??????我們經(jīng)常接觸的console就是一個宿主對象衔蹲,console在瀏覽器中是輸出到開發(fā)工具控制臺。而在Node.js和其他服務(wù)器端JavaScript環(huán)境中呈础,則是指向JavaScript環(huán)境系統(tǒng)進程的標準輸出(stdout)和標準錯誤輸出(stderr)舆驶。


3. 全局DOM對象

??????由于瀏覽器演進的歷史遺留問題,在創(chuàng)建帶有id屬性的DOM元素時也會創(chuàng)建同名的全局變量而钞。
??????這也是盡量不要使用全局變量的一個原因沙廉。如果確實要用,也要確保變量名的唯一性臼节,從而避免與其他地方的變量產(chǎn)生沖突蓝仲,包括HTML和其他第三方代碼。


4. 原生原型

??????不要擴展原生原型官疲。
??????因為你給原生對象添加的方法和屬性袱结,可能會在若干年后,剛巧跟JavaScript自己的變動發(fā)生沖突途凫,JavaScript可能也擴展了那個對象垢夹,添加了新方法和屬性,起的名字還跟你當年起的一樣维费。
??????也可能還有第三方代碼也干跟你一樣的傻事果元,然后你們沖突了促王。
??????所以大家都不應(yīng)該擴展原生原型,這不好而晒。

??????但polyfill是可以的蝇狼。
??????polyfill就是,已知新規(guī)范中有某方法倡怎,而一些不支持新規(guī)范的運行環(huán)境中沒有迅耘,給這些老運行環(huán)境加上這些方法。
??????polyfill能有效地為不符合最新規(guī)范的老版本瀏覽器填補缺失的功能监署。

??????ES5-Shim(https://github.com/es-shims/es5-shim)是一個完整的shim/polyfill集合颤专,能夠為你的項目提供ES5基本規(guī)范支持。同樣钠乏,ES6-Shim(https://github.com/es-shims/es6-shim)提供了對ES6基本規(guī)范的支持栖秕。

??????對于語法上的差別,可以用Traceur這樣的工具來實現(xiàn)新舊語法之間的轉(zhuǎn)換晓避。


5. <script>

??????在網(wǎng)頁中使用<script src=..></script>加載的js文件簇捍,以及在頁面內(nèi)用<script> .. </script>來包含的內(nèi)聯(lián)代碼,它們之間有些什么規(guī)則俏拱?
??????①它們共享global對象(在瀏覽器中則是window)垦写,也就是說這些文件中的代碼在共享的命名空間中運行,并相互交互彰触。
??????②如果某個script中定義了函數(shù)foo(),后面的script代碼就可以訪問并調(diào)用foo()命辖,就像foo()在其內(nèi)部被聲明過一樣况毅。
??????③但是全局變量作用域的提升機制在這些邊界中不適用。后面的script中聲明的變量尔艇,不會被提升到前面的script中尔许,在前面的script中訪問變量會拋出錯誤。
??????④如果script中的代碼發(fā)生錯誤终娃,它會像獨立的JavaScript程序那樣停止味廊,但是后續(xù)的script中的代碼(仍然共享global)依然會接著運行,不會受影響棠耕。
??????⑤在內(nèi)聯(lián)代碼中不可以出現(xiàn)</script>字符串余佛,一旦出現(xiàn)即被視為代碼塊結(jié)束。外部文件代碼則沒關(guān)系窍荧。
??????⑥我們是根據(jù)代碼文件的字符集屬性(UTF-8辉巡、ISO-8859-8等)來解析外部文件中的代碼(或者默認字符集),而內(nèi)聯(lián)代碼則使用其所在頁面文件的字符集(或者默認字符集)蕊退。內(nèi)聯(lián)代碼的script標簽沒有charset屬性郊楣。


6. 保留字

??????ES5規(guī)范在7.6.1節(jié)中定義了一些“保留字”憔恳,我們不能將它們用作變量名。這些保留字有四類:“關(guān)鍵字”净蚤、“預(yù)留關(guān)鍵字”钥组、null常量和true/false布爾常量。
??????在ES5之前今瀑,保留字也不能用來作為對象常量中的屬性名稱或者鍵值程梦,但ES5出來后就沒有這個限制了。
??????具體要看瀏覽器環(huán)境放椰,有些老版本瀏覽器還是不允許用保留字作為對象屬性作烟。所以注意測試各環(huán)境運行情況。


7. 實現(xiàn)中的限制

??????JavaScript規(guī)范對于函數(shù)中參數(shù)的個數(shù)砾医,以及字符串常量的長度等并沒有限制拿撩;但是由于JavaScript引擎實現(xiàn)各異,規(guī)范在某些地方有一些限制如蚜。
??????如:
??????①字符串常量中允許的最大字符數(shù)(并非只是針對字符串值)
??????②可以作為參數(shù)傳遞到函數(shù)中的數(shù)據(jù)大醒购恪(也稱為棧大小,以字節(jié)為單位)
??????③函數(shù)聲明中的參數(shù)個數(shù)
??????④未經(jīng)優(yōu)化的調(diào)用棧(例如遞歸)的最大層數(shù)错邦,即函數(shù)調(diào)用鏈的最大長度
??????⑤JavaScript程序以阻塞方式在瀏覽器中運行的最長時間(秒)
??????⑥變量名的最大長度

??????我們不會經(jīng)常碰到這些限制探赫,但應(yīng)該對它們有所了解,特別是不同的JavaScript引擎的限制各異撬呢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伦吠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子魂拦,更是在濱河造成了極大的恐慌毛仪,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芯勘,死亡現(xiàn)場離奇詭異箱靴,居然都是意外死亡,警方通過查閱死者的電腦和手機荷愕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門衡怀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人安疗,你說我怎么就攤上這事抛杨。” “怎么了荐类?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵蝶桶,是天一觀的道長。 經(jīng)常有香客問我掉冶,道長真竖,這世上最難降的妖魔是什么脐雪? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮恢共,結(jié)果婚禮上战秋,老公的妹妹穿的比我還像新娘。我一直安慰自己讨韭,他們只是感情好脂信,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著透硝,像睡著了一般濒生。 火紅的嫁衣襯著肌膚如雪罪治。 梳的紋絲不亂的頭發(fā)上雁社,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死款咖,一個胖子當著我的面吹牛奄喂,可吹牛的內(nèi)容都是我干的富腊。 我是一名探鬼主播是整,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了易迹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤陆淀,失蹤者是張志新(化名)和其女友劉穎轧苫,沒想到半個月后身冬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酥筝,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片靴患。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡相嵌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饭宾,到底是詐尸還是另有隱情批糟,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布看铆,位于F島的核電站徽鼎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏弹惦。R本人自食惡果不足惜否淤,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棠隐。 院中可真熱鬧石抡,春花似錦、人聲如沸助泽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗡贺。三九已至隐解,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诫睬,已是汗流浹背煞茫。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摄凡,地道東北人续徽。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像架谎,于是被迫代替她去往敵國和親炸宵。 傳聞我的和親對象是個殘疾皇子辟躏,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容