AST基础知识|Scope和Binding常用方法及属性总结

举报
悦来客栈的老板 发表于 2022/08/20 00:16:48 2022/08/20
【摘要】 关注它,不迷路。 本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除! 1. scope常用方法及属性总结: scope相关的源代码在这个js文件中,大家可以直接照着源码学习: node_modules\@babel\traverse\lib\scope\index.js...

关注它,不迷路。

本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!

1. scope常用方法及属性总结:

scope相关的源代码在这个js文件中,大家可以直接照着源码学习:

node_modules\@babel\traverse\lib\scope\index.js
  

scope的属性定义:


   
  1. class Scope {
  2. constructor(path) {
  3. this.uid = void 0;
  4. this.path = void 0;
  5. this.block = void 0;
  6. this.labels = void 0;
  7. this.inited = void 0;
  8. this.bindings = void 0;
  9. this.references = void 0;
  10. this.globals = void 0;
  11. this.uids = void 0;
  12. this.data = void 0;
  13. this.crawling = void 0;
  14. const {
  15. node
  16. } = path;
  17. const cached = _cache.scope.get(node);
  18. if ((cached == null ? void 0 : cached.path) === path) {
  19. return cached;
  20. }
  21. _cache.scope.set(node, this);
  22. this.uid = uid++;
  23. this.block = node;
  24. this.path = path;
  25. this.labels = new Map();
  26. this.inited = false;
  27. }
  28. ......
  29. }

在本文中,选出部分常用的属性和方法供大家参考,更多的知识请自行学习源码。

  1. scope.block   

    表示当前作用域下的所有node,参考上面的 this.block = node;

  2. scope.dump()  

    输出当前每个变量的作用域信息。调用后直接打印,不需要加打印函数

  3. scope.crawl()   

    重构scope,在某种情况下会报错,不过还是建议在每一个插件的最后一行加上。

  4. scope.rename(oldName, newName, block)   

    修改当前作用域下的的指定的变量名,oldname、newname表示替换前后的变量名,为字符串。注意,oldName需要有binding,否则无法重命名。

  5. scope.traverse(node, opts, state)

     遍历当前作用域下的某些(个)插件。和全局的traverse用法一样。

  6. scope.getBinding(name)

    获取某个变量的binding,可以理解为其生命周期。包含引用,修改之类的信息

2. binding常用方法及属性总结:

binding相关的源代码在这个js文件中,大家可以直接照着源码学习:

node_modules\@babel\traverse\lib\scope\binding.js
  

binding的属性定义:


   
  1. class Binding {
  2. constructor({
  3. identifier,
  4. scope,
  5. path,
  6. kind
  7. }) {
  8. this.identifier = void 0;
  9. this.scope = void 0;
  10. this.path = void 0;
  11. this.kind = void 0;
  12. this.constantViolations = [];
  13. this.constant = true;
  14. this.referencePaths = [];
  15. this.referenced = false;
  16. this.references = 0;
  17. this.identifier = identifier;
  18. this.scope = scope;
  19. this.path = path;
  20. this.kind = kind;
  21. this.clearValue();
  22. }
  23. ......
  24. }
  1. 目前我看到的只有 变量定义函数定义 拥有binding,其他的获取binding都是undefined。

    let binding = scope.getBinding(name);
        

    例如: var a = 123; 这里的 a 就拥有 binding。

    而 function test(a,b,c) {};

    函数名test以及形参a,b,c均拥有 binding。

  2. binding.path

    用于定位初始拥有binding的path;

  3. binding.constant

    用于判断当前变量是否被更改,true表示未改变,false表示有更改变量值。

  4. binding.referenced

    用于判断当前变量是否被引用,true表示代码下面有引用该变量的地方,false表示没有地方引用该变量。注意,引用和改变是分开的。

  5. binding.referencePaths

    它是一个Array类型,包含所有引用的path,多用于替换。

  6. binding.constantViolations

    它是一个Array类型,包含所有改变的path,多用于判断。

19c795f83746f59c2d1e0a00a0afe17c.png

你可以参考下面的这篇文章,学习更多scope相关的基础知识,感谢群友的总结:

https://evilrecluse.top/post/7389a59f/#%E4%BD%9C%E7%94%A8%E5%9F%9FScope-%E4%B8%8E-%E8%A2%AB%E7%BB%91%E5%AE%9A%E9%87%8FBinding
  

今天的文章就分享到这里,后续分享更多的技巧,敬请期待。

6292ef86b162f6f389b27215106d7251.jpeg

欢迎加入知识星球,学习更多爬虫技巧。

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/126377305

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。