2014-04-18 66 views
0

我知道功能檢測適用於嗅探對象和方法(比如JSON,querySelector等),但是新的語法呢?像默認的功能參數? 問題是它們導致無法捕獲的語法錯誤。如何檢測JavaScript的語法功能?

對此有何見解?除了瀏覽器和版本嗅探大多不可靠。

如果沒有辦法,這是否意味着我們不能使用新功能!那麼它們是什麼(可能在10年後使用!)

+0

「可能在10年後使用」好吧,如果你必須堅持對你的每一個應用程序的跨瀏覽器兼容性。不是所有的應用程序都有這個需求。 – BoltClock

+0

有ES6到ES5壓縮機:https://github.com/google/traceur-compiler。 –

+0

感謝您的有用答案,接受來自@icktoofay的答案 –

回答

3

嘗試在try - catch塊中創建函數。

var code = '"forgotten close quote'; 
var valid = true; 
try { 
    new Function(code); 
}catch(exc) { 
    valid = false; 
} 

這裏,試圖把"forgotten close quote成函數將失敗由於語法錯誤,然後將其抓住,並將爲validfalse

+0

儘管如此:'嘗試{let gen = function *(){yeild true; }} catch(e){console.log(); }' – Norguard

+0

@Norguard:我從來沒有建議將代碼嵌入'try'-'catch'中。我建議在'try'-'catch'中使用'new Function'。因此,使用我的答案中的技術,它將'try {new Function(「let gen = function *(){yeild true;}」); } catch(e){console.log(); }' – icktoofay

+0

我糾正,評估你的整個應用程序,或者使用你的代碼庫的x個排列,其中x是你想要的功能的數量,這是合理的。這跟Traceur差不多。 – Norguard

0

沒有可靠的方法來檢查對語法錯誤的一般支持。

但是今天有很多可以在NodeJS中使用的。 此外,沒有什麼能夠阻止你使用像Traceur這樣的轉譯器來編寫花哨的JS,並且讓它在另一端與ES5兼容。

3

正如icktoofay所示,有些方法可以在不引起語法錯誤的情況下檢查語法功能,但即使您這樣做,您會如何處理這些信息呢?根據所支持的語法功能,您需要擁有多個版本的代碼,並且需要動態加載腳本,而不是真正的目的。

要解決您最後的問題,您不一定要等待使用新功能。您可以在今日JavaScript編譯器旁邊使用JavaScript,例如traceur-compilerTypescript,其中包含未來的JavaScript功能並編譯爲適合瀏覽器的JavaScript。