如何证明我的JavaScript文件在特定JS或ECMA版本的范围内?

如何证明我的JavaScript文件在特定JS或ECMA版本的范围内?,javascript,version,Javascript,Version,假设您会得到一堆.js文件,现在您的工作就是将它们分成如下组: 至少需要JavaScript 1.85 至少需要E4X(ECMAScript 4 EX) 至少需要ECMAScript 5 或者类似的事情 我对任何解决方案都感兴趣,尤其是那些使用JavaScript或PHP的解决方案。这是用于创建自动化规范的,但这不重要——这是一项很好的任务,应该很容易解决——然而,我不知道如何解决,这对我来说并不容易。因此,如果这对你来说很容易,请分享任何提示 我期望类似的东西——只是不针对浏览器,而是针对

假设您会得到一堆.js文件,现在您的工作就是将它们分成如下组:

  • 至少需要JavaScript 1.85
  • 至少需要E4X(ECMAScript 4 EX)
  • 至少需要ECMAScript 5
或者类似的事情

我对任何解决方案都感兴趣,尤其是那些使用JavaScript或PHP的解决方案。这是用于创建自动化规范的,但这不重要——这是一项很好的任务,应该很容易解决——然而,我不知道如何解决,这对我来说并不容易。因此,如果这对你来说很容易,请分享任何提示

我期望类似的东西——只是不针对浏览器,而是针对给定的文件,根据不同的JavaScript实现进行检查

我的猜测是,每个版本都必须有一些细节,可以进行测试。然而,我能找到的只是关于“这个浏览器支持什么版本”的东西


PS:不要把“现在是你的工作”字面上理解,我用它来演示任务,而不是暗示我期望为我完成工作;在解决这个问题的过程中,如果能得到一些帮助或指导就好了


编辑:我采取了简单的方法,重新要求ECMAScript 5的支持至少与当前FireFox一样好,这样我的项目才能像intendet和预期的那样工作


然而,我仍然对任何解决方案尝试感兴趣,或者至少对“可能(,有XY)”或“不可能,因为……”的明确回答感兴趣;XY可以只是一些关键字,如FrameworkXY或DesignPatternXY或其他更详细的解决方案。

本质上,您希望找到一些javascript文件的最低要求。我认为在运行时之前是不可能的。JavaScript是一种动态语言。因此,您没有编译时错误。因此,在某种程度上,你无法判断某件事不起作用,即使这样,也会产生误导。实际上,您的依赖关系可以解决许多兼容性问题

例子:
  • JS文件A使用了一些ES5特性
  • JS文件B为ES5缺陷浏览器提供了一个垫片,或者至少以某种方式模拟了它
  • JS文件A和B总是一起加载,但单独加载A看起来不起作用
例2:
  • Object.create是您要测试的对象
  • 有个叫Crockford的家伙在Object.prototype中添加了create
  • Object.create现在可以在不太兼容的浏览器中工作,并且没有任何东西会被破坏
解决方案1:
  • 构建或查找依赖关系映射。您肯定已经有了一个依赖关系映射,或者显式地,或者您可以通过迭代HTML文件来生成它
  • 在功能减少的环境中运行所有相关的代码路径(例如:ES5、E4X、JS1.x等等)
  • 一旦JS文件包在某些代码路径上失败,您就知道了它们的最低要求
  • 也许您可以迭代对象中的公共函数,并使用依赖项注入来填充构造函数和方法。这听起来很难
  • 解决方案2:
  • 使用webdriver在各种环境中访问页面
  • window.onerror
    映射到一个函数,该函数告诉您当前页面是否在执行某些操作时中断
  • 出现错误时,您将知道当前页面上的捆绑包有问题,因此请保存该数据
    这两种解决方案都假设您总是编写完美的JS,而且从不出错,这是您应该努力做到的,但并不现实。这可能;但是,请提供一些基本的“冒烟测试”。

    这不可能以精确的方式实现,而且它也不是一种看待此类问题的好方法

    为什么不可能 Javascript没有静态类型。但是属性是由原型链决定的。这意味着,对于任何一段代码,在确定函数调用将调用什么函数之前,都必须推断对象的类型并沿着原型链进行检查

    例如,您必须能够识别
    $(x).bind()
    o
    $(x).map
    不是调用ECMAScript 5
    map
    bind
    函数,而是调用jQuery函数。这意味着您必须解析整个代码并对类型进行推断。如果没有完整的代码库,这是不可能的。如果您有一个接受对象的函数,并且您调用了bind,那么您将不知道该函数应该是
    function.prototype.bind
    还是
    jQuery.bind
    ,因为这要到运行时才能确定。事实上,它有可能(尽管不是很好的编码实践)两者兼而有之,并且运行的内容取决于函数的输入,甚至取决于用户的输入。所以你也许可以对此做出猜测,但你不能准确地做到

    eval函数与获取用户输入或ajax数据的能力相结合,使得所有这一切变得更加不可能,这意味着您甚至不知道某些对象是或可能是什么类型,甚至可以忽略eval可能尝试运行符合任何规范的代码的问题

    下面是一段无法解析的代码示例

    var userInput = $("#input").val();
    
    var objectThatCouldBeAnything = eval(userInput);
    
    object.map(function(x){
       return !!x; 
    });
    
    无法判断此代码是在eval中解析jQuery对象并运行
    jQuery.map
    ,还是生成数组并运行
    array.prototype.map
    。这就是像javascript这样的动态类型语言的优点和缺点。它提供了极大的灵活性,但限制了您在运行时之前对代码的了解

    为什么这不是一个好策略 ECMAScript规范是一种标准,但在实践中,它们从未得到完美或一致的实现。不同的环境实现了标准的不同部分。有一个“ECMAScr”