Javascript 为什么这是IE11和Pale Moon中的错误?

Javascript 为什么这是IE11和Pale Moon中的错误?,javascript,debugging,webpack,internet-explorer-11,palemoon,Javascript,Debugging,Webpack,Internet Explorer 11,Palemoon,我向FreeNAS团队报告了一个Javascript错误,与他们即将发布的版本有关,该版本在一些不太常见的浏览器上由于JS语法错误而无法工作,但我很好奇为什么会出现错误 该代码片段在Win8.1默认浏览器(IE11)和Pale Moon(基于Firefox)浏览器上引发了一个定义良好的错误,但在Firefox或Vivaldi(基于Chrome)浏览器上没有引发错误。代码实际上是做什么的,为什么它会在这些浏览器中触发保留字错误/语法错误 代码很难追踪,它看起来像一个网页化的文件,我对base+构建

我向FreeNAS团队报告了一个Javascript错误,与他们即将发布的版本有关,该版本在一些不太常见的浏览器上由于JS语法错误而无法工作,但我很好奇为什么会出现错误

该代码片段在Win8.1默认浏览器(IE11)和Pale Moon(基于Firefox)浏览器上引发了一个定义良好的错误,但在Firefox或Vivaldi(基于Chrome)浏览器上没有引发错误。代码实际上是做什么的,为什么它会在这些浏览器中触发保留字错误/语法错误

代码很难追踪,它看起来像一个网页化的文件,我对base+构建系统不够熟悉,无法在打包之前了解它的最终来源

触发错误的相关代码段在浏览器控制台中如下所示:

webpackJsonp([20], {

  ... long list of function defs ...

  BFiu: function(t, e, n) {
    "use strict";
    n.d(e, "a", function() {
      return r
    });
    var o = n("HcJ8");
    n.n(o);
    let i = {
      Queue: 0,
      Uploading: 1,
      Done: 2,
      Cancelled: 3
    };
    i[i.Queue] = "Queue",
    i[i.Uploading] = "Uploading",
    i[i.Done] = "Done", 
    i[i.Cancelled] = "Cancelled";
    class r {}
  },

  ... more function defs ...

},
[0]);
根据JS控制台,这是导致某些浏览器出现致命语法错误的行
classr{}
,并终止GUI加载脚本。Pale Moon表示问题在于误用了保留字“class”,IE11只是指向同一个字并报告了一个语法错误。但在其他浏览器上也可以

直觉上,我认为即使是在臭名昭著的不同浏览器和JS引擎中(显然不是?),对这样一个关键字JS单词的保留字误用也会得到相当好的定义,所以我很感兴趣。发生什么事了

理想情况下(如果能够提供帮助的话),我怎样才能找到这个代码片段的上游源代码,这样我就可以查看它的问题/错误跟踪程序了


源代码:代码片段来自FreeNAS 11.2-RC2中的文件“main.57ebfd2da23881a70.bundle.js”。我在FreeNAS build/WebUI系统中一直跟踪到的第69行,其中文件名显然是在webpack构建它时引用的,但我不知道如何追溯到它的来源,以查看此代码段来自哪个模块,或者,无论模块来自哪个项目,都有上游错误报告。

class
是一个ES6(ES2015)关键字,适用于大多数浏览器,但不适用于像IE这样的古老浏览器(IE的最新版本IE11于2013年发布)。尽管PaleMoon表示他们符合ES6标准,但它似乎还不支持
——该公司的意见是:

JS中的类只是一个非常非常糟糕的想法,试图将OO结构从一种不同的语言强制执行到一些根本不是设计用来这样做的东西

也没有理由使用类本身,因为对类所做的任何事情都可以使用基本的和完全兼容的JS原型来完成。原型设计是有原因的;使用它

对于使用“类”语法并希望其代码与IE、Palemon和其他不符合标准的浏览器兼容的开发人员来说,一般解决方案是将其集成到构建过程中,该过程可以自动将代码库的ES6+语法(包括“类”关键字)转换为ES5语法:

变成

"use strict";

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Foo = function Foo() {
  _classCallCheck(this, Foo);
};

class
关键字在像IE这样的古老浏览器中是不受支持的,这是阿拉哈!非常感谢。后续问题-我如何跟踪原始项目/模块,无论这些代码在网页打包之前来自何处,以查看是否有报告,或者是否可以在上游“源头”修复?我建议项目维护人员只需使用Babel将其代码自动传输到ES5(由IE支持),不要单独使用ES6+语法(包括
class
和许多其他东西),谢谢!我有点希望有人能找到一种方法来追踪代码片段的相关项目维护人员,这看起来像是第三方项目。但是这些信息很有帮助。@CertainPerformance-你能把以上几点作为答案吗?他们优雅地解决了这个问题,但我不能将他们标记为这样做,除非你这么做:)
"use strict";

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Foo = function Foo() {
  _classCallCheck(this, Foo);
};