Esrecurse 
Esrecurse (esrecurse)是 ECMAScript 递归遍历功能。
示例使用
下面的代码将输出在文件根目录下声明的所有变量。
esrecurse.visit(ast, {
XXXStatement: function (node) {
this.visit(node.left);
// do something...
this.visit(node.right);
}
});
我们可以用 Visitor 实例。
var visitor = new esrecurse.Visitor({
XXXStatement: function (node) {
this.visit(node.left);
// do something...
this.visit(node.right);
}
});
visitor.visit(ast);
我们可以继承 Visitor 实例。
class Derived extends esrecurse.Visitor {
constructor()
{
super(null);
}
XXXStatement(node) {
}
}
function DerivedVisitor() {
esrecurse.Visitor.call(/* this for constructor */ this /* visitor object automatically becomes this. */);
}
util.inherits(DerivedVisitor, esrecurse.Visitor);
DerivedVisitor.prototype.XXXStatement = function (node) {
this.visit(node.left);
// do something...
this.visit(node.right);
};
您可以在自定义访问操作中调用默认访问操作。
function DerivedVisitor() {
esrecurse.Visitor.call(/* this for constructor */ this /* visitor object automatically becomes this. */);
}
util.inherits(DerivedVisitor, esrecurse.Visitor);
DerivedVisitor.prototype.XXXStatement = function (node) {
// do something...
this.visitChildren(node);
};
这个 childVisitorKeys 选项不自定义的行为 this.visitChildren(node)。
我们可以使用用户定义的节点类型。
// This tree contains a user-defined `TestExpression` node.
var tree = {
type: 'TestExpression',
// This 'argument' is the property containing the other **node**.
argument: {
type: 'Literal',
value: 20
},
// This 'extended' is the property not containing the other **node**.
extended: true
};
esrecurse.visit(
ast,
{
Literal: function (node) {
// do something...
}
},
{
// Extending the existing traversing rules.
childVisitorKeys: {
// TargetNodeName: [ 'keys', 'containing', 'the', 'other', '**node**' ]
TestExpression: ['argument']
}
}
);
我们可以用 fallback 还有选项。
如果 fallback 选择是 "iteration", esrecurse 将访问未知节点的所有可枚举属性。
请注意循环引用会导致堆栈溢出。AST可能出于某些目的在其他属性中有循环引用(例如: node.parent).
esrecurse.visit(
ast,
{
Literal: function (node) {
// do something...
}
},
{
fallback: 'iteration'
}
);
如果 fallback 期权是一个函数, esrecurse 调用此函数以确定未知节点的可枚举属性。
请注意循环引用会导致堆栈溢出。AST可能出于某些目的在其他属性中有循环引用(例如: node.parent).
esrecurse.visit(
ast,
{
Literal: function (node) {
// do something...
}
},
{
fallback: function (node) {
return Object.keys(node).filter(function(key) {
return key !== 'argument'
});
}
}
);
许可证
版权所有2014 Yusuke Suzuki (推特: @Constellation)和其他贡献者。
重新分发和使用的源代码和二进制形式,有或没有 在满足下列条件的情况下,允许进行修改:
-
重新发布源代码必须保留上述版权 注意,此条件列表和以下免责声明。
-
以二进制形式重新发布必须复制上述版权 注意,本条件列表和以下免责声明中的 随发行版提供的文件和/或其他材料。
本软件由版权所有者和贡献者“按原样”提供。 以及任何明示或暗示的保证,包括但不限于 对适销性和适合某一特定目的的默示保证 是否认。在任何情况下,我都不承担任何责任 直接的、间接的、偶然的、特殊的、惩戒性的或后果性的损害 (包括但不限于,替代商品或服务的采购; 损失:失去使用、数据或利润;或业务中断),无论如何引起和 在任何责任理论中,无论是合同责任、严格责任还是侵权责任 (包括疏忽或其他)因使用 本软件即使被告知有这种损害的可能性。