阅读Javascript注释

阅读Javascript注释,javascript,comments,Javascript,Comments,虽然Javascript注释(事实上,一般的注释)的要点是它们不是由编译器解析的,但我想知道是否有一种方法可以真正使用Javascript读取注释,即 /* Hello, world! */ function readComment() { alert(readsTheCommentSomehow()) //Would alert "Hello, World!" } 类似这样的用例可能是这样的,或者更酷的,比如让代码根据上面的注释来改变它所做的事情。我相信还有其他的理由想这么做 到目前

虽然Javascript注释(事实上,一般的注释)的要点是它们不是由编译器解析的,但我想知道是否有一种方法可以真正使用Javascript读取注释,即

/* Hello, world! */
function readComment() {
    alert(readsTheCommentSomehow()) //Would alert "Hello, World!"
}
类似这样的用例可能是这样的,或者更酷的,比如让代码根据上面的注释来改变它所做的事情。我相信还有其他的理由想这么做

到目前为止,我考虑的唯一方法是(以某种方式)让Javascript读取自己的代码,并按
/*
\n
/
*/
等内容进行拆分,然后以这种方式返回注释

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

编译器会解析(然后丢弃)注释。许多提供解析器的工具,如和,都公开了中间阶段(抽象语法树),这些阶段

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

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

请注意,空白通常在注释之前被丢弃,或者,如果可以的话,解析器会完全跳过它(在JS中,使用ASI更难做到这一点)。

编译器会解析注释(然后丢弃)。许多提供解析器的工具,如和,都公开了中间阶段(抽象语法树),这些阶段

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

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


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

您可以使用AST解析器和转换器(如babel)来读取和更改代码。以下是关于如何根据您的评论阅读和更改巡更代码的简单而简单的示例:

原始代码:

// does something
// and other stuff
function doSomething() {
  console.log('hello');
}
巴别塔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);
        }
      }
    }
  };
}

您可以使用AST解析器和转换器(如babel)来读取和更改代码。以下是关于如何根据您的评论阅读和更改巡更代码的简单而简单的示例:

原始代码:

// does something
// and other stuff
function doSomething() {
  console.log('hello');
}
巴别塔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);
        }
      }
    }
  };
}

唯一的方法是将文件作为文本加载并编写自己的解析器。唯一的方法是将文件作为文本加载并编写自己的解析器。