附錄D:第 5 版中可能會對第 3 版產(chǎn)生兼容性影響的更正及澄清

2018-06-16 15:51 更新

全體:在第 3 版規(guī)范中像“就像用表達式 new Array() 一樣”這樣的短語的意思受到了誤解。第 5 版規(guī)范中,對標準內(nèi)置對象、屬性的所有內(nèi)部引用和內(nèi)部調(diào)用相關(guān)文本描述,都做了澄清:應(yīng)使用實際的內(nèi)置對象,而不是對應(yīng)命名屬性的當前動態(tài)值。

 11.8.2,11.8.3,11.8.5:ECMAScript 總體上是以從左到右的順序解釋執(zhí)行,但是第 3 版規(guī)范中 > 和 <= 運算符的描述語言導(dǎo)致了局部從右到左的順序。本規(guī)范已經(jīng)更正了這些運算符,現(xiàn)在完全是從左到右的順序解釋執(zhí)行。然而,這個對順序的修改,如果在解釋執(zhí)行過程期間產(chǎn)生副作用,就有可能被觀察到。

 11.1.4:第 5 版澄清了 Array Initialiser 結(jié)束位置的尾端逗號不計入數(shù)組長度。這不是對第 3 版語義的修改,但有些實現(xiàn)在之前可能對此有誤解。

 11.2.3:第 5 版調(diào)換了算法步驟 2 和 3 的順序。第 1 版一直到第 3 版規(guī)定的順序是錯誤的,原來的順序在解釋執(zhí)行 Arguments 時有副作用,可能影響到 MemberExpression 的解釋執(zhí)行結(jié)果。

 12.14:在第 3 版中,對于傳給 try 語句的 catch 子句的異常參數(shù)的名稱解析,用與 new Object() 一樣的方式創(chuàng)建一個對象來作為解析這個名稱的作用域。如果實際的異常對象是個函數(shù)并且在catch 子句中調(diào)用了它,那么作用域?qū)ο髮鳛?this 值傳給這個調(diào)用。在函數(shù)體里可以給它的 this 值定義新屬性,并且這些屬性名將在函數(shù)返回之后在 catch 子句的作用域內(nèi)變成可見的標識符綁定。在第 5 版中,如果把異常參數(shù)作為函數(shù)來調(diào)用,傳入的 this 值是 undefined 。

 13:在第 3 版中,有 Identifier 的 FunctionExpression 產(chǎn)生式的算法,用與 new Object() 一樣的方式創(chuàng)建一個對象并加入到作用域鏈中,用來提供函數(shù)名查找的作用域。標識符解析規(guī)則(第 3 版里的 10.1.4 )會作用在這樣的對象上,如果需要,還會用對象的原型鏈來嘗試解析標識符。這種方式使得 Object.prototype 的所有屬性以標識符的形式在這個作用域里可見。實踐中,大多數(shù)第 3 版的實現(xiàn)都沒有實行這個語義。地 5 版更改了這里的語義,用一個聲明式環(huán)境記錄項來綁定了函數(shù)名。

 14:在第 3 版中,產(chǎn)生式 SourceElements : SourceElements SourceElement 的算法不像相同形式的 Block,對 statement 的結(jié)果值做正確的傳遞。這可導(dǎo)致 eval 函數(shù)解釋執(zhí)行一個 Program 文本時產(chǎn)生錯誤的結(jié)果。實踐中,大多數(shù)第 3 版的實現(xiàn)都做了正確的傳遞,而不關(guān)心第 5 版規(guī)定了什么。

 15.10.6:RegExp.prototype 現(xiàn)在是一個 RegExp 對象,而不是 Object 的一個實例。用 Object.prototype.toString 可看到它的 [[Class]] 內(nèi)部屬性值現(xiàn)在是 "RegExp",不是 "Object"。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號