如何证明我的JavaScript文件在特定JS或ECMA版本的范围内?
假设您会得到一堆.js文件,现在您的工作就是将它们分成如下组:如何证明我的JavaScript文件在特定JS或ECMA版本的范围内?,javascript,version,Javascript,Version,假设您会得到一堆.js文件,现在您的工作就是将它们分成如下组: 至少需要JavaScript 1.85 至少需要E4X(ECMAScript 4 EX) 至少需要ECMAScript 5 或者类似的事情 我对任何解决方案都感兴趣,尤其是那些使用JavaScript或PHP的解决方案。这是用于创建自动化规范的,但这不重要——这是一项很好的任务,应该很容易解决——然而,我不知道如何解决,这对我来说并不容易。因此,如果这对你来说很容易,请分享任何提示 我期望类似的东西——只是不针对浏览器,而是针对
- 至少需要JavaScript 1.85
- 至少需要E4X(ECMAScript 4 EX)
- 至少需要ECMAScript 5
PS:不要把“现在是你的工作”字面上理解,我用它来演示任务,而不是暗示我期望为我完成工作;在解决这个问题的过程中,如果能得到一些帮助或指导就好了
编辑:我采取了简单的方法,重新要求ECMAScript 5的支持至少与当前FireFox一样好,这样我的项目才能像intendet和预期的那样工作
然而,我仍然对任何解决方案尝试感兴趣,或者至少对“可能(,有XY)”或“不可能,因为……”的明确回答感兴趣;XY可以只是一些关键字,如FrameworkXY或DesignPatternXY或其他更详细的解决方案。本质上,您希望找到一些javascript文件的最低要求。我认为在运行时之前是不可能的。JavaScript是一种动态语言。因此,您没有编译时错误。因此,在某种程度上,你无法判断某件事不起作用,即使这样,也会产生误导。实际上,您的依赖关系可以解决许多兼容性问题 例子:
- JS文件A使用了一些ES5特性
- JS文件B为ES5缺陷浏览器提供了一个垫片,或者至少以某种方式模拟了它李>
- JS文件A和B总是一起加载,但单独加载A看起来不起作用
- Object.create是您要测试的对象
- 有个叫Crockford的家伙在Object.prototype中添加了create
- Object.create现在可以在不太兼容的浏览器中工作,并且没有任何东西会被破坏李>
window.onerror
映射到一个函数,该函数告诉您当前页面是否在执行某些操作时中断这两种解决方案都假设您总是编写完美的JS,而且从不出错,这是您应该努力做到的,但并不现实。这可能;但是,请提供一些基本的“冒烟测试”。这不可能以精确的方式实现,而且它也不是一种看待此类问题的好方法 为什么不可能 Javascript没有静态类型。但是属性是由原型链决定的。这意味着,对于任何一段代码,在确定函数调用将调用什么函数之前,都必须推断对象的类型并沿着原型链进行检查 例如,您必须能够识别
$(x).bind()
o$(x).map
不是调用ECMAScript 5map
或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”