正在阅读 Javascript 条评论

Reading Javascript Comments

虽然 Javascript 注释(实际上是一般注释)的要点是它们 被编译器解析,但我想知道是否有使用 Javascript 实际阅读评论的方法 - 即

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

这样的用例类似于 Javadoc,或者更酷的东西,例如获取代码以根据上面的注释更改它所做的事情。我敢肯定还有其他原因想要这样做。

到目前为止,我考虑过这样做的唯一方法是实际上(以某种方式)让 Javascript 读取它自己的代码,由 /*\n 之类的东西分开, //, */ 和 return 这样的评论。

这真的是解决这个问题的最佳方法吗,还是我遗漏了什么?

注释 被编译器解析(然后丢弃)。许多提供解析器的工具,例如 esprima and Babel, expose the intermediate stages (the abstract syntax tree) which can be used to extra comments.

到代码 执行时 ,注释以及其他不会实际影响代码运行方式的任何内容都已被丢弃。

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

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

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

原代码:

// does something
// and other stuff
function doSomething() {
  console.log('hello');
}

babel ast 转换器:

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);
        }
      }
    }
  };
}