虽然Javascript注释(实际上是一般的注释)的要点是编译器不会解析它们,但我想知道是否有一种方法可以使用Javascript实际读取注释 - 即
/* Hello, world! */
function readComment() {
alert(readsTheCommentSomehow()) //Would alert "Hello, World!"
}
像这样的东西的用例是像Javadoc这样的东西,或者更酷的东西,比如让代码根据上面的注释来改变它的作用。我敢肯定,还有其他原因想要这样做。
到目前为止,我考虑这样做的唯一方法是实际上(以某种方式)使Javascript读取自己的代码,按/*
,n
,//
,*/
之类的东西进行拆分,并以这种方式返回注释。
这真的是解决此问题的最佳方法,还是我错过了什么?
您可以使用 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);
}
}
}
};
}
注释由编译器解析(然后丢弃)。许多提供解析器的工具,如esprima和Babel,都公开了可用于额外注释的中间阶段(抽象语法树)。
在执行代码时,注释已被丢弃,以及实际上不会影响代码运行方式的任何其他内容。
有很多JS文档工具(如JSDoc)使用注释来提供文档,并简单地将它们从解析中获取,通常不执行代码。一旦您有一个可以生成带有注释节点的 AST 的分析器,您就可以遍历该树并将注释绑定到以下节点。
请注意,空格通常会在注释之前被丢弃,或者如果可以的话,被解析器完全跳过(这在 JS 中使用 ASI 时更困难)。