【问题标题】:JavaScript using toString on a Function object to read text contentJavaScript 在 Function 对象上使用 toString 来读取文本内容
【发布时间】:2010-04-16 04:22:21
【问题描述】:

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

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

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

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

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

非常感谢。 :)

【问题讨论】:

    标签: javascript function tostring


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      https://jsfiddle.net/deamvp7r/

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        本质上相当于

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

        注释也可以放在 ES6 类上。

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-09
          • 2017-11-14
          • 2012-08-27
          • 2015-07-25
          • 2018-01-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多