解析JS加密解密中的生成器构造

在这里插入图片描述

前言

之前JS解密的客户,有一部分代码里是有生成器构造出来代码,一些基础比较薄弱的客户以及技术就看起来比较费劲看不懂了,这里特意写一篇文章为这部分客户服务。尽量言简意赅,以下是示例代码:

function YV(YD) {return function (YC) {return function (Yd) {if (Y6) {throw new TypeError("Generator is already executing.");}for (; Y9 && (Y9 = 0, Yd[0] && (Yz = 0)), Yz;) try {if (Y6 = 1, Y7 && (Y8 = 2 & Yd[0] ? Y7.return : Yd[0] ? Y7.throw || ((Y8 = Y7.return) && Y8.call(Y7), 0) : Y7.next) && !(Y8 = Y8.call(Y7, Yd[1])).done) {return Y8;}switch (Y7 = 0, Y8 && (Yd = [2 & Yd[0], Y8.value]), Yd[0]) {case 0:case 1:Y8 = Yd;break;case 4:return Yz.label++, {"value": Yd[1],"done": false};case 5:Yz.label++, Y7 = Yd[1], Yd = [0];continue;case 7:Yd = Yz.ops.pop(), Yz.trys.pop();continue;default:if (!((Y8 = (Y8 = Yz.trys).length > 0 && Y8[Y8.length - 1]) || 6 !== Yd[0] && 2 !== Yd[0])) {Yz = 0;continue;}if (3 === Yd[0] && (!Y8 || Yd[1] > Y8[0] && Yd[1] < Y8[3])) {Yz.label = Yd[1];break;}if (6 === Yd[0] && Yz.label < Y8[1]) {Yz.label = Y8[1], Y8 = Yd;break;}if (Y8 && Yz.label < Y8[2]) {Yz.label = Y8[2], Yz.ops.push(Yd);break;}Y8[2] && Yz.ops.pop(), Yz.trys.pop();continue;}Yd = Y5.call(Y4, Yz);} catch (YQ) {Yd = [6, YQ], Y7 = 0;} finally {Y6 = Y8 = 0;}if (5 & Yd[0]) {throw Yd[1];}return {"value": Yd[0] ? Yd[1] : void 0,"done": true};}([YD, YC]);};}

生成器是JavaScript中的一个强大特性,允许创建可迭代的数据流,使开发人员能够编写看似同步的异步代码。虽然生成器可能一开始看起来复杂,但了解它们的构造可以揭示其行为,并促进在代码中有效使用它们。

让我们分解一下一个示例生成器函数,理解其结构和功能,以便深入了解生成器在JavaScript中的工作原理以及如何解释JavaScript中的生成器构造。

生成器代码的解构

提供的生成器函数非常复杂,使用了嵌套函数和复杂的逻辑。让我们分解其结构,了解其关键组成部分:

  • 嵌套函数表达式:生成器函数由三个嵌套的函数表达式组成。这种嵌套是生成器实现中的常见模式,有助于创建可迭代的上下文。
  • 迭代循环:函数利用for循环迭代生成器的内部状态,并处理各种情况。这个循环是管理生成器执行流程的主要组成部分。
  • Try-Catch-Finally 块:在循环内部,使用try-catch-finally块来处理异常和清理任务。这确保了生成器在异常情况下的稳健处理和资源管理。
  • Switch 语句:Switch语句用于根据生成器的当前状态和接收到的输入确定要采取的操作。根据生成器的状态和接收到的输入,跟随不同的执行路径。
  • 生成器状态管理:生成器使用变量如 Y6Y7Y8Y9YzYd 来跟踪生成器的执行状态、当前迭代和迭代过程中的中间值。
  • 返回值:生成器使用 return 语句产生值,封装在一个带有 "value""done" 属性的对象中。这种格式符合可迭代协议,可以与JavaScript的迭代机制无缝集成。

理解生成器构造

要理解JavaScript中的生成器构造,必须掌握以下几个关键概念:

  1. 生成器生命周期:生成器具有独特的生命周期,可以在挂起、运行和完成等状态之间转换。了解生成器如何管理其状态对于理解其行为至关重要。
  2. 迭代协议:生成器遵循可迭代协议,使其可以在 for...of 循环和扩展操作符等构造中使用。掌握这个协议可以让开发人员有效地在代码中利用生成器。
  3. 执行流程:生成器提供了独特的执行流程,允许代码的暂停和恢复执行。这种流程由生成器内部管理,利用了 yieldnext() 等结构。
  4. 错误处理:当处理生成器时,健壮的错误处理至关重要,因为它们可能引入异步行为和复杂的控制流。了解生成器如何处理错误可以确保创建可靠且具有弹性的代码。
  5. 资源管理:生成器可能涉及资源分配和清理任务。正确的资源管理实践,如使用 try...finally 块,对于防止资源泄漏和确保代码稳定性至关重要。

下面是代码的执行流程分析:

  1. 函数 YV 接受一个参数 YD,返回一个函数。
  2. 返回的函数接受一个参数 YC,并返回另一个函数。
  3. 最终返回的函数接受一个参数 Yd,表示生成器的初始状态。

在分析执行流程时,需要注意以下几个关键变量和概念:

  • Y6: 表示生成器是否正在执行的标志。初始值为0,表示未执行。
  • Y7: 生成器当前执行的迭代器。
  • Y8: Y7 的迭代结果对象,包含 { value, done }
  • Y9: 生成器是否已经暂停的标志。
  • Yz: 生成器的状态对象,用于控制生成器的执行流程。
  • Yd: 生成器的输入参数,是一个数组 [YD, YC]

现在让我们来分析代码的主要执行流程:

  1. 首先,检查 Y6 是否为真,表示生成器是否已经在执行中。如果是,则抛出错误,防止重复执行。
  2. 进入循环,在每次迭代中执行以下步骤:
    • 如果 Y9 为真,表示生成器已经暂停,则将 Y9 设为0,并重置 YzYd[0]
    • 尝试执行 Y7,即当前迭代器对象。
    • 根据迭代器的返回结果,更新 Y8
    • 根据 Yd[0] 的值(指示迭代器的状态),执行相应的操作:
      • 如果是 01,表示迭代器正常执行,更新 Y8
      • 如果是 4,表示迭代器产生一个值,返回 { value, done: false }
      • 如果是 5,表示迭代器产生一个异常,捕获异常并处理。
      • 如果是 7,表示需要执行 finally 块,从 Yz.opsYz.trys 中恢复。
      • 其他情况根据异常类型和处理流程进行处理。
  3. 如果迭代过程中出现了需要抛出的异常,则将异常抛出。
  4. 如果没有异常,则根据迭代器的返回值,构造并返回最终的结果对象 { value, done }

这样,该生成器函数实现了一个复杂的执行流程,能够管理生成器的状态和执行过程,并提供了完善的错误处理机制。

结论

总之,在JavaScript中,生成器是一个强大的构造,可以用来创建可迭代的数据流,并具有独特的执行语义。通过分析和理解生成器构造,开发人员可以充分利用它们的潜力,在代码中编写简洁、表达力强且高效的代码。对生成器功能的掌握使开发人员能够应对复杂的异步挑战,并在JavaScript中构建可靠、可扩展的应用程序。

有不懂的可以联系jsjiami官方客服咨询,js加解密也可咨询。

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

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

相关文章

【动态规划】【 数位dp】2827. 范围中美丽整数的数目

本文涉及知识点 数位dp 动态规划汇总 LeetCode2827. 范围中美丽整数的数目 给你正整数 low &#xff0c;high 和 k 。 如果一个数满足以下两个条件&#xff0c;那么它是 美丽的 &#xff1a; 偶数数位的数目与奇数数位的数目相同。 这个整数可以被 k 整除。 请你返回范围 [l…

仿懂车帝的二手车交易平台功能介绍

二手车交易平台app是一款功能丰富的二手车交易平台&#xff0c;以下是其主要功能介绍&#xff1a; 二手车信息展示&#xff1a;APP首页展示各类二手车信息&#xff0c;包括车型、品牌、价格等&#xff0c;用户可以轻松浏览并选择自己感兴趣的车辆。搜索与筛选功能&#xff1a;…

哈希技术解析:从哈希函数到哈希桶迭代器的全面指南

文章目录 引言一、哈希表与哈希函数1、哈希表的基本原理2、哈希函数的作用与特点3、哈希冲突的处理方法 二、哈希桶及其迭代器1、 哈希桶a.定义哈希桶结构b.哈希函数c.哈希桶的插入、查找、删除 2、 哈希桶的迭代器a.类型定义与成员变量b.构造函数c.解引用与比较操作d.递增操作…

Liunx进程间通信

进程间通信 进程间通信进程间通信的基本概念进程间通信的目的 管道匿名管道进程池 命名管道 system V进程间通信system V进程间通信基本概念system V共享内存共享内存和管道的对比 system V 信号量信号量同步和互斥 进程间通信 进程间通信的基本概念 进程间通信就是在不同进程…

6-LINUX-- C 程序的编译与调试

一.环境搭建 1.gcc的安装 1>.切换到管理员模式 sudo su ----> 输入密码 2>.apt install gcc //C语言的编译环境 3>.apt install g //c编译环境的搭建 4>.install update //软件升级 2.gcc分步编译链接 &#xff08;1&#xff09;预编译 gcc -E…

计算机生物科技在基因编辑中的应用及其前景

一、引言 基因编辑&#xff0c;作为一种能够精准修改生物体基因组的技术&#xff0c;近年来受到了广泛的关注。 而计算机生物科技作为连接计算机科学与生物学的桥梁&#xff0c;为基因编辑技术的快速发展提供了强大的支持。通过利用计算机算法和数据分析方法&#xff0c;研究人…

Dashe Media全球新闻稿发布协助您实现传播目标-海外媒体宣发

亚太区新闻稿发布网络 Dashe Media 是唯一一家于亚太区拥有专有记者网络和网上新闻媒体发布网络的全球新闻通讯社 Dashe Media 在该地区的 26 个国家拥有 200,000 名记者和编辑数据库&#xff0c;涵盖 500 个新闻类别、68,000 个新闻媒体和 1,500 个在线新闻媒体合作伙伴&…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Refresh)

可以进行页面下拉操作并显示刷新动效的容器组件。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 从API version 11开始&#xff0c;Refresh子组件会跟随手势下拉而下移…

HarmonyOS 通知意图

之前的文章 我们讲了 harmonyos 中的 基础和进度条通知 那么 今天 我们来说说 任何给通知添加意图 通知意图 简单说 就是 当我们点击某个通知 如下图 然后 就会拉起某个 应用 就例如说 我们某个微信好友发消息给我们 我们 点击系统通知 可以直接跳到你们的聊天界面 好 回到…

JavaScript中的继承方式详细解析

什么是继承 继承是面向对象编程中的一个重要概念&#xff0c;它指的是一个对象&#xff08;或类&#xff09;可以获得另一个对象&#xff08;或类&#xff09;的属性和方法。在继承中&#xff0c;被继承的对象通常称为父类&#xff08;或基类、超类&#xff09;&#xff0c;继…

(css)vue 自定义背景 can‘t resolve

(css)vue 自定义背景 can’t resolve 旧写法&#xff1a; background-image: url(/assets/images/step-bg.jpg);background-size: 100% 100%; 新写法&#xff1a; background-image: url(~/assets/images/step-bg.jpg);background-size: 100% 100%; 解决参考&#xff1a;https…

【RabbitMQ | 第七篇】RabbitMQ实现JSON、Map格式数据的发送与接收

文章目录 7.RabbitMQ实现JSON、Map格式数据的发送与接收7.1消息发送端7.1.1引入依赖7.1.2yml配置7.1.3RabbitMQConfig配置类——&#xff08;非常重要&#xff09;&#xff08;1&#xff09;创建交换器方法&#xff08;2&#xff09;创建队列方法&#xff08;3&#xff09;绑定…

代码随想录算法训练营第27天|93.复原IP地址、78.子集、90.子集二

目录 一、力扣93.复原IP地址1.1 题目1.2 思路1.3 代码1.4 总结 二、力扣78.子集2.1 题目2.2 思路2.3 代码2.4 总结 三、力扣90.子集二3.1 题目3.2 思路3.3 代码3.4 总结 一、力扣93.复原IP地址 &#xff08;比较困难&#xff0c;做起来很吃力&#xff09; 1.1 题目 1.2 思路 …

【数据结构练习题】栈——1.括号匹配 2.逆波兰表达式求值 3.出栈入栈次序匹配 4.最小栈

♥♥♥♥♥个人主页♥♥♥♥♥ ♥♥♥♥♥数据结构练习题总结专栏♥♥♥♥♥ 文件目录 前言1.括号匹配1.1问题描述1.2解题思路1.3画图解释1.4代码实现2.逆波兰表达式求值 2.1问题描述2.2解题思路2.3画图解释2.4代码解释3.出栈入栈次序匹配 3.1问题描述3.2思路分析3.3画图解释3.…

【No.13】蓝桥杯二分查找|整数二分|实数二分|跳石头|M次方根|分巧克力(C++)

二分查找算法 知识点 二分查找原理讲解在单调递增序列 a 中查找 x 或 x 的后继在单调递增序列 a 中查找 x 或 x 的前驱 二分查找算法讲解 枚举查找即顺序查找&#xff0c; 实现原理是逐个比较数组 a[0:n-1] 中的元素&#xff0c;直到找到元素 x 或搜索整个数组后确定 x 不在…

CPU设计实战—异常处理指令

异常类型以及精确异常的处理 异常有点像中断&#xff0c;处理完还要回到原来的状态&#xff0c;所以需要对之前的状态进行保存。本CPU主要实现对以下异常的处理&#xff1a; 1.外部硬件中断 2.复位异常 3.系统调用异常&#xff08;发生在译码阶段&#xff09; 4.溢出异常&…

做好外贸网站SEO优化,拓展海外市场

随着全球贸易的发展和互联网的普及&#xff0c;越来越多的外贸企业将目光投向了网络&#xff0c;希望通过建立网站来拓展海外市场。然而&#xff0c;在竞争激烈的外贸市场中&#xff0c;要让自己的网站脱颖而出&#xff0c;吸引更多的目标客户&#xff0c;就需要进行有效的SEO优…

openGauss学习笔记-246 openGauss性能调优-SQL调优-经验总结:SQL语句改写规则

文章目录 openGauss学习笔记-246 openGauss性能调优-SQL调优-经验总结&#xff1a;SQL语句改写规则246.1 使用union all代替union246.2 join列增加非空过滤条件246.3 not in转not exists246.4 选择hashagg246.5 尝试将函数替换为case语句246.6 避免对索引使用函数或表达式运算2…

面试算法-50-二叉树的最大深度

题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 解 class Solution {public int maxDepth(TreeNo…

《算法设计与分析第二版》100行 C语言实现 广度度优先算法 BFS——最短距离

抄录自课本P157页。 #include <stdio.h> #define MAXQ 100 // 队列大小 #define MAxN 10 // 最大迷宫大小 int n8; // 迷宫大小 char Maze [MAxN][MAxN] {{O,X,X,X,X,X,X,X,},{O,O,O,X,O,X,O,X,},{X,X,O,O,O,X,O,X,},{X,X,O,X,O,X,X,X,},…