理解JS try和catch语句(用于添加自定义Modernizr测试)

时间:2014-06-12 11:33:18

标签: javascript try-catch modernizr

我目前正在使用两个Modernizr测试相结合来提供便利功能。我正在使用的两个Modernizr测试是'blob'和'SMIL'。

但是,由于我只是在Modernizr构建中使用这两个测试来实现这一点,我希望将测试组合成一个具有更有意义名称的自定义测试。例如:

;(function enhancedTest() {
    Modernizr.addTest('enhanced', function () {
         try {
            return !!new Blob();
            return !!document.createElementNS &&
                  /SVGAnimate/.test(toStringFn.call(document.createElementNS('http://www.w3.org/2000/svg', 'animate')));
         } catch (e) {
            return false;
         }
    }, {
         aliases: ['enhanced']
    });
})();

如果设备不支持try内的返回部分的 ,我基本上希望测试失败。如果设备支持两者,则应该通过。

我以前从来没有用try和catch写任何东西,我想知道这是否会像我期望的那样起作用?

我担心的是,目前,如果它在第一个return !!new Blob()成功,它将通过测试(即使它可能在第二部分失败)。

是这样的吗?或者我应该如何重构代码以实现我的目标呢?

1 个答案:

答案 0 :(得分:1)

  

我担心的是,目前,如果它在第一次返回!!new Blob()时成功,它将通过测试(即使它可能在第二部分失败)。

你是对的。

尝试:

Modernizr.addTest(
  'enhanced',
  function() {
    try {
      new Blob(); // this line can throw an exception.
      return !!document.createElementNS && /SVGAnimate/.test( toStringFn.call( document.createElementNS('http://www.w3.org/2000/svg', 'animate') ) );
    } catch(e) {
      return false;
    }
  }
);