2011-07-05 36 views
15

Internet Explorer不支持「const」關鍵字。我可以使用一個shim來檢查是否支持「const」,如果不支持,將其重新定義爲var?我想如果它強制執行恆定性,可能使用object.Freeze會很好,但是用簡單的墊片就沒問題。Javascript shim將Internet Explorer的「const」重新定義爲「var」

更新:我想要這個,所以我可以使用現有的使用「const」的Javascript庫而不修改它們。顯然,查找/替換可以工作,但它很混亂,不可維護。

+7

如果代碼無論標識符是否爲常量(因爲您不介意給予IE var'),那麼爲什麼不只是製作所有標識符變量? – lonesomeday

+7

@ lonesomeday - 同樣的原因const被髮明出來。它比var更好地記錄代碼的意圖,並且當const可用時,它也強制執行該意圖。他試圖在可用時使用語言優勢,而不僅僅是編入最低的共同標準。我感覺合理。 – jfriend00

+0

增加了一些信息 - 主要原因是我希望能夠使用其他人編寫的庫而不修改它們。 –

回答

1

您可以編寫服務器端填充,因此當請求.js文件時,當文件流式傳輸到瀏覽器時,任何const替換爲var。 (需要適當的分詞/空白檢測)

由於您在服務器上,您無法檢測瀏覽器功能,並且必須依賴User-Agent字符串才能對IE執行此操作,或者使用JavaScript在客戶端瀏覽器上運行告訴服務器它需要非常量代碼。

我用一個真正由Java servlet支持的「userprefs.css」文件做類似的事情,專門爲每個用戶構建和流式傳輸文件。

+0

謝謝 - 我希望有一種方法可以做到這一點,客戶端使用功能檢測和定義常量,如果它不被支持。不過,服務器端可能是唯一的選擇。 –

+0

基於這個想法,如果您正在動態請求頁面,那麼您可以在javascript中執行特徵檢測,並使用後綴加載所有頁面: ?常量=假。使用快遞(可能還有其他服務器),您可以很輕鬆地檢查這種情況,然後在返回頁面之前進行處理。 – Griffork

1

我會使用Modernizer進行此操作,並根據對Const的支持加載適當的腳本文件。您可以編寫一個Grunt JS插件,通過自動查找並替換'const'來自動構建IE的第二個版本。