我知道功能检测适用于嗅探对象和方法(比如JSON,querySelector等),但是新的语法呢?像默认的功能参数? 问题是它们导致无法捕获的语法错误。如何检测JavaScript的语法功能?
对此有何见解?除了浏览器和版本嗅探大多不可靠。
如果没有办法,这是否意味着我们不能使用新功能!那么它们是什么(可能在10年后使用!)
我知道功能检测适用于嗅探对象和方法(比如JSON,querySelector等),但是新的语法呢?像默认的功能参数? 问题是它们导致无法捕获的语法错误。如何检测JavaScript的语法功能?
对此有何见解?除了浏览器和版本嗅探大多不可靠。
如果没有办法,这是否意味着我们不能使用新功能!那么它们是什么(可能在10年后使用!)
尝试在try
- catch
块中创建函数。
var code = '"forgotten close quote';
var valid = true;
try {
new Function(code);
}catch(exc) {
valid = false;
}
这里,试图把"forgotten close quote
成函数将失败由于语法错误,然后将其抓住,并将为valid
到false
。
尽管如此:'尝试{let gen = function *(){yeild true; }} catch(e){console.log(); }' – Norguard
@Norguard:我从来没有建议将代码嵌入'try'-'catch'中。我建议在'try'-'catch'中使用'new Function'。因此,使用我的答案中的技术,它将'try {new Function(“let gen = function *(){yeild true;}”); } catch(e){console.log(); }' – icktoofay
我纠正,评估你的整个应用程序,或者使用你的代码库的x个排列,其中x是你想要的功能的数量,这是合理的。这跟Traceur差不多。 – Norguard
没有可靠的方法来检查对语法错误的一般支持。
但是今天有很多可以在NodeJS中使用的。 此外,没有什么能够阻止你使用像Traceur这样的转译器来编写花哨的JS,并且让它在另一端与ES5兼容。
正如icktoofay所示,有些方法可以在不引起语法错误的情况下检查语法功能,但即使您这样做,您会如何处理这些信息呢?根据所支持的语法功能,您需要拥有多个版本的代码,并且需要动态加载脚本,而不是真正的目的。
要解决您最后的问题,您不一定要等待使用新功能。您可以在今日JavaScript编译器旁边使用JavaScript,例如traceur-compiler或Typescript,其中包含未来的JavaScript功能并编译为适合浏览器的JavaScript。
“可能在10年后使用”好吧,如果你必须坚持对你的每一个应用程序的跨浏览器兼容性。不是所有的应用程序都有这个需求。 – BoltClock
有ES6到ES5压缩机:https://github.com/google/traceur-compiler。 –
感谢您的有用答案,接受来自@icktoofay的答案 –