阅读Javascript评论

时间:2016-02-11 18:25:43

标签: javascript comments

虽然Javascript评论的意思(实际上,评论一般)是编译器解析它们,但我想知道是否有办法使用Javascript实际读取评论 - 即

/* Hello, world! */
function readComment() {
    alert(readsTheCommentSomehow()) //Would alert "Hello, World!"
}

类似这样的用例就像Javadoc,或者更酷的东西,比如获取代码来改变它依赖于它上面的注释。我确信还有其他理由想要这样做。

到目前为止,我考虑这样做的唯一方法是实际(以某种方式)使Javascript读取自己的代码,分为/*\n//等内容,*/并以这种方式返回评论。

这真的是解决这个问题的最好方法,还是我错过了什么?

2 个答案:

答案 0 :(得分:2)

编译器 解析(然后丢弃)。许多提供解析器的工具(如esprimaBabel)都会公开can be used to extra comments的中间阶段(抽象语法树)。

当代码执行时,评论已被丢弃,以及其他任何不会影响代码运行方式的内容。

有很多JS文档工具(比如JSDoc)使用注释来提供文档并简单地将它们从解析中删除,通常不执行代码。一旦你有一个可以用注释节点生成AST的解析器,你就可以遍历那棵树并将注释绑定到下一个节点。

请注意,空格通常在注释之前被丢弃,或者如果可以的话,完全被解析器跳过(在JS中,使用ASI则更难)。

答案 1 :(得分:0)

您可以使用AST解析器和变形器(如babel)来读取和更改您的代码。以下是根据您的评论如何阅读和更改旅游代码的简单而天真的示例:http://astexplorer.net/#/5ezZ2lwYHQ

原始代码:

// does something
// and other stuff
function doSomething() {
  console.log('hello');
}
巴贝尔变压器:

export default function ({types: t}) {
  return {
    visitor: {
      FunctionDeclaration(path) {
        if (path.node.leadingComments) {
          const text = path.node.leadingComments.map(comment => comment.value).join('\n');
          const change = t.expressionStatement(
            t.callExpression(
              t.memberExpression(t.identifier('console'), t.identifier('log')), 
                [
                  t.stringLiteral(`Function has comments:${text}`)
                ]));

          path.node.body.body.unshift(change);
        }
      }
    }
  };
}