2014-04-18 95 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。