在下面的函数上调用toString()会在浏览器之间返回不同的字符串。我理解这是因为ECMA-262 15.3.4.2为每个供应商留下了摆动空间。
除了所有语法之外,Chrome还会返回评论。可悲的是Firefox 3.6省略了评论。基于Firefox的行为,我没有测试IE,Opera或Safari。
function foo() {
/* comment */
var bar = true;
}
具体来说,我试图将元数据嵌入到函数内特殊格式的注释块中。稍后将解析函数toString()方法的返回值,并将值作为对象返回。
我无法找到兼容性表或toString()的替代品。社区有什么想法吗?顺便说一下,预处理JS文件不是一种选择。 :(
非常感谢。 :)
答案 0 :(得分:1)
虽然不像嵌入注释那样直接,但由于函数是JS中的第一类对象,因此可以为它们指定任意属性。 E.g:
> function f(x) { return x * x; }
undefined
> f
function f(x) { return x * x; }
> f.comment = 'Hello'
Hello
> f.comment
Hello
通过这种方式,您可以干净利落地将元数据嵌入到函数对象中。
答案 1 :(得分:1)
我最近试图回答这个问题,并且遇到了这个问题。为了提供更新,我仍然无法找到兼容性表,因此我创建了以下小提琴:
https://jsfiddle.net/deamvp7r/
if((function(){ /*test*/ }).toString().match('test').length === 0) {
alert ("NO SUPPORT");
} else {
alert ("SUPPORTED");
}
并在BrowserStack上手动测试。对于它的价值,这里是我测试过的浏览器以及到目前为止我在Function.toString()中的注释支持所发现的:
这个列表显然远不是详尽无遗的,所以如果你必须支持更旧/更模糊的浏览器,请小心。但目前支持评论的流行浏览器的百分比似乎相当高。
答案 2 :(得分:0)
"注释"功能是您似乎尝试做的一个很好的解决方案。目前,它在Traceur中实现(参见here)。注释使用@
语法,如下所示:
@Anno('foo')
function func() {}
基本上这相当于
function func() {}
func.annotate = [ new Anno('foo') ];
注释也可以放在ES6课程上。
即使您不能或不想使用新的注释语法,装饰具有属性的函数以包含其元数据似乎比在函数体中嵌入此类元数据更好,无论是否作为注释或者其他(一个想法类似于"use strict"
),然后尝试使用字符串操作来提取它。
注释功能仍处于讨论阶段,并且存在对变体的并行建议,称为"装饰器"您可能知道,概念本身并不新鲜,并且可以在其他语言中找到,例如Python,Java和C#。正在考虑将注释包含在语言风格中,包括AtScript,TypeScript和ES7。
另见JavaScript annotations。有关基于解析的方法,请参阅http://ariya.ofilabs.com/2014/04/tracking-javascript-annotations.html。