javascript转成ast后,如何确定两个同名变量等是否是同一作用域下的变量?
转换工具是:https://astexplorer.net/
代码如下:
const { parse, print, visit } = require('recast')
const ast = parse(`function test(samename){
samename(123);
var b = {
c: function (samename){
samename(456)
},
d: function() {
samename(789)
}
}
}`)
const funcAst = ast.program.body[0]
const arg = funcAst.params[0]
console.log(arg)
visit(funcAst, {
visitCallExpression(path) {
// 如何检查path.value.callee是不是和arg是同一个变量
console.log(path.value.callee)
this.traverse(path)
}
})
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果只是这一个问题的话,逐级往上找
BlockStatement
,然后确定是哪个块级作用域下的。实际通用做法是,维护一个表,在
walk
时更新表或对表进行查找。当然,你也可以自己实现
parser
,或者有些parser
库也支持自定义插件扩展。这样,可以在所有的闭包(块)开始,把所有你想要的数据传递给子级,甚至可以设计观察者模式,将每个Node
都设计成可观察的对象都是可以的。你可以自由发挥。