2016-02-11 82 views
0

虽然JavaScript注释点(事实上,在一般评论)是他们由编译器解析,我想知道是否有实际读取使用JavaScript注释的方式 - 即阅读JavaScript注释

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

类似这样的用例可能类似于Javadoc,或者像获取代码以更改它依赖于其上方注释的更酷的东西。我相信还有其他理由也想要这样做。

到目前为止,我已经考虑过这样做的唯一途径是通过实际(不知)让JavaScript的阅读自己的代码,由之类的东西/*\n//*/拆分并返回意见的方式。

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

+0

唯一的办法是加载文件作为文本并编写您自己的解析器。 – epascarello

回答

2

评论被编译器解析(然后丢弃)。提供解析器的许多工具(如esprimaBabel)公开了哪些中间阶段(抽象语法树),哪些是can be used to extra comments

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

有很多JS文档工具(如JSDoc),它们使用注释来提供文档并简单地将它们从解析中获取,通常不需要执行代码。一旦你有一个解析器可以产生带有注释节点的AST,你可以走这棵树并将注释与下面的节点联系起来。

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

0

您可以使用AST分析器和像babel这样的转换器来读取和更改代码。以下是关于如何根据您的意见读取和改变游码简单,简单的例子:http://astexplorer.net/#/5ezZ2lwYHQ

原代码:

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