学习菜老板知识星球2-Day

news/2024/11/15 16:23:58/文章来源:https://www.cnblogs.com/xiaocaikun/p/18298790

今天我们来学习一下
作用域Scope 与 被绑定量Binding

作用域 Scope
@Babel解析出来的语法树节点对象会包含作用域信息,这个信息会作为节点Node对象的一个属性保存
这个属性本身是一个Scope对象,其定义位于node_modules/@babel/traverse/lib/scope/index.js中

执行 Scope.dump(),会得到自底向上的 作用域与变量信息

const parser = require("@babel/parser");
const traverse = require("@babel/traverse").default;const jscode = `
function squire(i){return i * i * i;
}
function i()
{var i = 123;i += 2;return 123;
}
`;
let ast = parser.parse(jscode);
const visitor = {"FunctionDeclaration"(path){console.log("\n\n这里是函数 ", path.node.id.name + '()')path.scope.dump();}
}traverse(ast, visitor);

运行之后,这个只是一部分

每一个作用域都以#标识输出
每一个绑定都以-标识输出
先输出当前作用域,再输出父级作用域,再输出父级的父级作用域,以此类推
我在说一下 { constant: true, references: 3, violations: 0, kind: 'param' } 这个语句里面的代码

FunctionDeclaration 表示这是一个函数声明。

  • i 指的是函数 squire 的一个参数名为 i。
    { constant: true } 表示这个参数 i 在函数体内部没有被重新赋值,它是一个常量。如果是 false,就说明在函数体内被赋值了
    { references: 3 } 表示在函数体内部,i 被引用了3次。
    { violations: 0 } 表示没有违反任何特定的编码规则或最佳实践。
    { kind: 'param' } 表示 i 是一个函数行参。

接下来说一下

Program

  • squire
  • i

Program 表示这是关于整个程序的信息,而不是单个函数。

  • squire 表示 squire 函数在程序中的状态。
    { constant: true } 表示 squire 函数在程序中没有在赋值给它,它是一个常量。
    { references: 0 } 表示在程序的其它部分,squire 函数没有被引用。
    { violations: 0 } 表示没有违反任何特定的编码规则或最佳实践。
    { kind: 'hoisted' } 表示 squire 函数是一个在执行前被提升到其作用域顶部的函数声明。{ kind: 'var' }表示是一个var声明变量

接下来我们来说一下i函数

i()函数里面有两个声明变量,分别是a和i,很明显变量i是被重新赋值了的,所以他的constant是false
{ violations: 1 } 表示有一个编码规则或最佳实践的违反。

我们来看看scope中的getBinding中的用法
`const parser = require("@babel/parser");
const traverse = require("@babel/traverse").default;
const generator = require("@babel/generator").default;

const jscode = var a = 1; var b = 2; function squire(){ var c = 3; var d = 4; return a * d; var e = 5; } var f = 6;;
let ast = parser.parse(jscode);
const visitor = {
VariableDeclarator(path)
{
const func_name = path.node.id.name;
const binding = path.scope.getBinding(func_name);
// 如果变量没有被引用过,那么删除也没关系
// 此处不能用有无修改过进行判断,因为没有被修改过并不意味着没用
if(binding && !binding.referenced){
//binding存在并且,binding中的referenced属性为false,意思是该变量没有被引用
path.remove();
}
},
}

traverse(ast, visitor);
console.log(generator(ast)['code']);`

这里使用了Scope.getBinding()方法来获取Binding对象, 判断其引用情况来对语法树进行修改
其他用法可以参考蔡老板的教程
蔡老板的教程:https://mp.weixin.qq.com/s/yFcSXmXChGNaT7wPlaj0uw
今天就先记录到这里,拜拜~
蔡老板的教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/742557.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

易优cms网站weapp功能:用于网站安装更多的插件,建议放置在文件模板的底部-Eyoucms

【基础用法】名称:weapp功能:用于网站安装更多的插件,建议放置在文件模板的底部。语法:{eyou:weapp type=default /}参数:type= 类型底层字段:无本文来自博客园,作者:黄文Rex,转载请注明原文链接:https://www.cnblogs.com/hwrex/p/18298795

【nvm、node、npm、nrm】安装配置教程(windows版)

一、nvm 的安装与配置 1、nvm 下载与安装 nvm官方下载地址 (我这里使用当前最新版本 1.1.12)2、验证 nvm 是否安装成功 # 查看 nvm 版本 nvm -v # 显示远程可安装 node 列表 nvm ls available # 安装指定 node 版本(版本可以直接输入大版本,比如20,会自动安装20大版本下的最…

易优Eyoucms网站assign功能:模板文件中定义变量,可在其他标签里使用该变量

【基础用法】名称:assign功能:模板文件中定义变量,可在其他标签里使用该变量语法:{eyou:assign name=typeid value=5 /}文件:无参数:name= 变量名value= 赋给变量名的值底层字段:无 【更多示例】-------------------------------示例1--------------------------------描…

易优cms网站notempty功能:判断某个变量是否为空,可以嵌套到任何标签里面使用-Eyoucms

【基础用法】名称:notempty功能:判断某个变量是否为空,可以嵌套到任何标签里面使用,比如:channel、type等语法: {eyou:notempty name=$eyou.field.seo_title /} {$eyou.field.seo_title} {/eyou:notempty} 文件:无参数:name= 变量名底层字段:无 【更多示例】---------…

易优Eyoucms网站channelartlist获取当前频道的下级栏目的内容列表

channelartlist 获取当前频道的下级栏目的内容列表[基础用法]名称:channelartlist功能:获取当前频道的下级栏目的内容列表标签语法: {eyou:channelartlist typeid=栏目ID type=son row=20} <a href={eyou:field name=typeurl /}>{eyou:field name=typename /}</a&g…

如何将pdf文件提取为图片?

如果你经常处理PDF文档,你可能会遇到需要提取其中的图片的情况。无论是用于个人使用、商业用途还是学术研究,提取PDF中的图片都是一项非常有用的技能。本文将为你介绍一些简单而有效的方法,帮助你轻松提取PDF中的图片。 方法一:使用pdf转换器 极速玩转是一款功能强大的PDF转…

帝国CMS网站的编辑器默认会清除多余的word代码,如果要保留word格式怎么修改?

编辑器默认会清除多余的word代码,如果要保留word格式怎么修改?答:CKeditor编辑器默认复制会清除多余word代码,如果要保留word格式可以按下面修改配置:修改 /e/admin/ecmseditor/infoeditor/config.js(后台) 和 /e/data/ecmseditor/infoeditor/config.js(前台) 文件,找到:…

Fatal error: Call to a member function read() on a non-object in 错误解决方法(织梦程序报错)

大家都说这是因为织梦代码优化不好怎么着怎么着的,其实有一些是因为这个原因,但不是完全因为这个。dede登录后台卡死原因分析登录完后台,加载的分别为顶部、左侧、右侧内容三个部分。  顶部只是简单的查询一下权限不会卡、左侧也是简单的查询了一下也不会卡,那么原因就是…

易优cms留言表单时间类型导出是一串数字 显示不是正常日期

请问下留言表单时间类型后台导出为时间戳 如何转化正常日期 ?这个是时间戳问题, 属于网站功能问题。 临时解决办法:表格可以转换一下格式本文来自博客园,作者:黄文Rex,转载请注明原文链接:https://www.cnblogs.com/hwrex/p/18298641

基于PCIe总线架构的2路1GSPS AD、4路1GSPS DA信号处理平台(100%国产化)

板卡概述PCIE723-165是基于PCIE总线架构的2通道1GSPS采样率14位分辨率、4通道1GSPS采样率16位分辨率信号处理平台,该板卡采用国产16nm FPGA作为实时处理器,支持2路高速采集以及4路高速数据回放,板载2组DDR4 SDRAM大容量数据缓存,板卡支持PCIE GEN3 x8主机接口,通过DMA方式…

环境部署之在 Linux 服务器上搭建和部署 Python 环境

背景说明在企业工作中,自动化测试框架落地肯定会集成到Jenkins服务器上做持续集成测试,自动构建以及发送结果到邮箱,实现真正的无人值守测试。  不过Jenkins搭建一般都会部署在公司的服务器上,不会在私人电脑里,而服务器大部分都是Linux操作系统的。如果要在Linux上的Je…

倒计时

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace 倒计时 {public partial class Form1 : Form{public Form1(){Initia…