5

在下面的函数上调用 toString() 会在浏览器中返回不同的字符串。我理解这是因为 ECMA-262 15.3.4.2 为每个供应商留出了回旋余地。

除了所有语法外,Chrome 还会返回注释。遗憾的是 Firefox 3.6 忽略了注释。基于 Firefox 的行为,我没有测试过 IE、Opera 或 Safari。

function foo() {
    /* comment */
    var bar = true;
}

具体来说,我试图将元数据嵌入到函数内的特殊格式的注释块中。稍后将解析函数 toString() 方法的返回值,并将值作为对象返回。

我一直无法找到兼容性表或 toString() 的替代品。社区有什么想法吗?顺便说一句,预处理 JS 文件不是一个选项。:(

非常感谢。:)

4

3 回答 3

1

我最近试图回答这个问题,并遇到了这个问题。为了提供更新,我仍然找不到兼容性表,所以我创建了以下小提琴:

https://jsfiddle.net/deamvp7r/

if((function(){ /*test*/ }).toString().match('test').length === 0) {
    alert ("NO SUPPORT");   
} else {
     alert ("SUPPORTED");   
}

并在 BrowserStack 上手动测试。对于它的价值,这里是我测试过的浏览器,以及到目前为止我在 Function.toString() 中的评论支持方面发现的内容:

  • IE8 - 11:支持评论
  • Firefox <= 16:不支持
  • Firefox >= 17 : 支持评论
  • Chrome 14 +:支持评论
  • IOS iPhone 3GS浏览器+:支持评论
  • iPad 1 +:支持评论
  • Android 2.3 (Galaxy) + : 支持评论

此列表显然远非详尽,因此如果您还必须支持较旧/更晦涩的浏览器,请小心。但目前支持评论的流行浏览器的百分比似乎相当高。

于 2015-04-18T23:58:16.960 回答
1

虽然不如嵌入注释那么直接,但由于函数是 JS 中的一等对象,您可以为它们指定任意属性。例如:

> function f(x) { return x * x; }
undefined
> f
function f(x) { return x * x; }
> f.comment = 'Hello'
Hello
> f.comment
Hello

通过这种方式,您可以干净且可移植地将元数据嵌入到函数对象中。

于 2010-04-16T04:32:52.207 回答
0

“注释”功能对于您似乎正在尝试做的事情来说是一个很好的解决方案。目前,它在 Traceur 中实现(参见此处)。注解使用@语法,如下:

@Anno('foo')
function func() {}

本质上这相当于

function func() {}
func.annotate = [ new Anno('foo') ];

注释也可以放在 ES6 类上。

即使您不能或不想使用新的注释语法,使用属性来装饰函数以包含其元数据似乎比将此类元数据嵌入函数体中更好的主意,无论是作为注释还是其他方式(一个想法就是类似于"use strict"),然后尝试使用字符串操作来提取它。

注释功能仍处于讨论阶段,并且存在称为“装饰器”等变体的并行提案。您可能知道,这个概念本身并不新鲜,并且在 Python、Java 和 C# 等其他语言中也有发现。正在考虑将注释包含在包括 AtScript、TypeScript 和 ES7 在内的语言风格中。

另请参阅JavaScript 注释。对于基于解析的方法,请参阅http://ariya.ofilabs.com/2014/04/tracking-javascript-annotations.html

于 2015-04-19T03:04:46.090 回答