如何证明我的JavaScript文件属于特定JS或ECMA版本?

Joo*_*ook 15 javascript version

假设您将获得一堆.js文件,现在您可以将它们分组为以下组:

  • 至少需要JavaScript 1.85
  • 至少需要E4X(ECMAScript 4 EX)
  • 至少需要ECMAScript 5

或类似的东西.

我对任何解决方案感兴趣,尤其是那些使用JavaScript或PHP工作的解决方案.这用于创建自动化规范,但它无关紧要 - 这是一个很容易解决的好任务 - 但是,我不知道如何对我来说并不容易.所以,如果这对你来说很容易,请分享任何提示.

我希望这样的东西 - http://kangax.github.com/es5-compat-table/# - 不是针对浏览器,而是针对不同的JavaScript实现来检查给定文件.

我的猜测是,每个版本都必须有一些细节,可以进行测试.但是,我能找到的只是"这个浏览器支持的版本".


PS:不要从字面上看"现在是你的工作",我用它来展示任务,而不是暗示我希望为我做的工作; 在解决这个问题的过程中,获得一些帮助或指导会很不错.


编辑:我采取了简单的方法,通过要求ECMAScript 5得到支持至少与当前的FireFox一样好,以便我的projekt能够像预期的那样工作.

但是,我仍然在任何解决方案中尝试过 - 尝试或者至少有一个明确的答案"可能(用XY)"或"不可能,因为......"; XY可以只是一些关键字,如FrameworkXY或DesignPatternXY或其他任何或更详细的解决方案.

Ben*_*ick 3

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

为什么不可能

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

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

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

这是一段您无法解析的代码示例

var userInput = $("#input").val();

var objectThatCouldBeAnything = eval(userInput);

object.map(function(x){
   return !!x; 
});
Run Code Online (Sandbox Code Playgroud)

无法判断此代码​​是在 eval 中解析 jQuery 对象并运行,jQuery.map还是生成数组并运行Array.prototype.map。这就是像 JavaScript 这样的动态类型语言的优点和缺点。它提供了巨大的灵活性,但限制了您在运行前可以了解的代码内容。

为什么这不是一个好的策略

ECMAScript 规范是一个标准,但在实践中它们从来没有完美或一致地实现。不同的环境实施该标准的不同部分。拥有“ECMAScript5”代码并不能保证任何特定浏览器都能完美实现其所有属性。您确实必须根据每个属性来确定这一点。

您最好做的是找到代码使用的函数或属性的列表。然后,您可以将其与特定环境支持的属性进行比较。

由于上述原因,这仍然是一个困难到不可能的问题,但它至少是一个有用的问题。即使使用松散近似,您也可以获得价值(假设bind实际上是 ecmascript5 $(),除非它在包装上。这不会是完美的,但仍然可能有用)。

试图找出一个已实施的标准对于帮助您决定是否在特定环境中使用它来说是不切实际的。最好了解它使用哪些函数或属性,以便您可以将其与环境进行比较,并在必要时添加填充。