flex,promise里catch,作用域和作用域链和闭包,递归展开嵌套数组

目录

1. flex里shrink,grow和basis具体应用

2 promise里的catch

3 作用域和作用域链

4 递归展开嵌套数组


1. flex里shrink,grow和basis具体应用

<style>
.container {
display:flex;
width:600px;
}.div1 {
flex:1 2 500px;
}.div2 {
flex:2 1 400px;
}
</style><div class="container"><div class="div1"></div><div class="div2"></div>
</div>

500px+400px超出 600宽度300px

shrink发挥作用,按照2:1缩小比例

div1缩小 200px,div2缩小100px,最终 都是300px

例子 1:增加容器宽度 

.container {display: flex;width: 1000px;
}
.div1 {flex: 1 2 500px;
}
.div2 {flex: 1 1 400px;
}

剩余空间为100px,两者都拓宽50px,宽度分别为550px和450px

例子3:没有 flex-grow 或 flex-shrink 

.container {display: flex;width: 1000px;
}
.div1 {flex: 0 0 500px;
}
.div2 {flex: 0 0 400px;
}

这里 flex-grow 和 flex-shrink 都是 0,这意味着不管容器宽度如何,子元素宽度都固定为 500px 和 400px

例子4:div1 div2各自有宽度

.container {display: flex;width: 600px;
}
.div1 {width:400px;flex: 1 2 500px;}
.div2 {width:400px;flex: 2 1 400px;}

以400px+400px,发现超出200px

.div1 的缩小比例为 2/3,所以它缩小的部分为 200px * (2/3) = 133.33px

.div2 的缩小比例为 1/3,所以它缩小的部分为 200px * (1/3) = 66.67px

.div1 的最终宽度:400px - 133.33px = 266.67px

.div2 的最终宽度:400px - 66.67px = 333.33px

2 promise里的catch

  2.1 多级嵌套的 Promise 链

function fetchData1() {return new Promise((resolve, reject) => {setTimeout(() => {Math.random() > 0.5 ? resolve('Data 1') : reject('Error 1');}, 1000);});}function fetchData2() {return new Promise((resolve, reject) => {setTimeout(() => {Math.random() > 0.5 ? resolve('Data 2') : reject('Error 2');}, 1000);});}function fetchData3() {return new Promise((resolve, reject) => {setTimeout(() => {Math.random() > 0.5 ? resolve('Data 3') : reject('Error 3');}, 1000);});}fetchData1().then((data1) => {console.log(data1);return fetchData2();}).then((data2) => {console.log(data2);return fetchData3();}).then((data3) => {console.log(data3);}).catch((error) => {// console.error('Caught an error:', error);throw Error('apple')}).catch((err)=>{'pine',err})

在promise链中 如果promise出现错误被reject 错误会沿着链向下传播 直到遇到第一个catch为止,链条后续的then处理被跳过 直接进入catch

所以可能的输出是:

Data 1
 Data 2
 pine Error: apple

哪里出现 pine Error: apple 后续的就会终止

2.2多次重试机制的 Promise

function fetchDataWithRetry(retries = 3) {return new Promise((resolve, reject) => {function attempt() {setTimeout(() => {Math.random() > 0.5 ? resolve('Success') : retries-- > 0 ? attempt() : reject('Failed after retries');}, 1000);}attempt();});}fetchDataWithRetry().then((result) => {console.log(result);}).catch((error) => {console.error('Error:', error);});

2.3 多个并发的 Promise 任务与错误处理

function fetchData(id) {return new Promise((resolve, reject) => {setTimeout(() => {Math.random() > 0.5 ? resolve(`Data ${id}`) : reject(`Error from ${id}`);}, 1000);});}Promise.allSettled([fetchData(1), fetchData(2), fetchData(3)]).then((results) => {results.forEach((result) => {if (result.status === 'fulfilled') {console.log('Fulfilled:', result.value);} else {console.error('Rejected:', result.reason);}});});

2.4 结合 async/await 与 try/catch 捕获

function fetchData1() {return new Promise((resolve, reject) => {setTimeout(() => {Math.random() > 0.3 ? resolve(`Data 1`) : reject(`Error from 1`);}, 1000);});}function fetchData2() {return new Promise((resolve, reject) => {setTimeout(() => {Math.random() > 0.4 ? resolve(`Data 2`) : reject(`Error from 2`);}, 1000);});}function fetchData3() {return new Promise((resolve, reject) => {setTimeout(() => {Math.random() > 0.6 ? resolve(`Data 3`) : reject(`Error from 3`);}, 1000);});}async function fetchData() {try {const data1 = await fetchData1();console.log(data1);} catch (error) {console.error('Caught an error during fetch:', error);}try{const data2 = await fetchData2();console.log(data2);} catch (error) {console.error('Caught an error during fetch:', error);}try{const data3 = await fetchData3();console.log(data3);} catch (error) {console.error('Caught an error during fetch:', error);}} fetchData()

一个函数里可以有多个try-catch模块

3 作用域和作用域链

作用域: 函数和变量可见范围

作用域链:当前作用域找不到变量 到上一层找 直到全局也找不到  层层关系

shadowing:局部和外部同名 局部会遮蔽外部

局部变量可以访问外部和全局(任何地方都能访问对象)

利用闭包保存状态

执行上下文:全局,函数

执行栈:先全局执行上下文压入栈里,每次函数调用就新的执行上下文压入栈里,然后执行栈顶 弹出执行上下文

生命周期: 创建:确定this,词法和变量环境;执行:变量赋值 代码执行;回收:弹出执行上下文

js执行有解释和执行阶段,作用域是解释阶段确定的,执行上下文是执行阶段确定的

闭包形成是函数定义 作用域链和执行上下文共同作用 

function outer() {const value = 'outer value'; // 外部变量function inner() {const value = 'inner value'; // 内部变量,遮蔽外部变量console.log(value); // 输出 'inner value'}console.log(value); // 输出 'outer value'return inner;}let x = outer();x()

inner函数形成闭包 即使outer已执行完毕还是能访问value,然后保留对value的引用

fn.length 是一个属性,返回函数 fn 的参数个数

function curry(fn) {return function curried(...args) {if (args.length >= fn.length) {return fn(...args);}return function(...args2) {return curried(...args, ...args2);};};
}function multiply(a, b) {return a * b;
}const curriedMultiply = curry(multiply);
console.log(curriedMultiply(2)(3)); 

4 递归展开嵌套数组

//'abc'->value:'abc'//'[abc[def]]'->{value:'abc',children:{value:'def',children:null}}function digui(str,index){let node={value:'',children:null}while(index.value<str.length){let char=str[index.value++]if(char==='['){node.children=digui(str,index);}else if(char===']')break;else node.value+=char}return node}function yuan(str){let index={value:0}if(str[index.value]==='['){index.value++return digui(str,index)}else return digui(str, index)}let str1='abc'let str2='[abc[def]]'console.log(yuan(str1))console.log(yuan(str2))

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

GNU链接器(LD):设置入口点(ENTRY命令)的用法及实例解析

0 参考资料 GNU-LD-v2.30-中文手册.pdf GNU linker.pdf1 前言 一个完整的编译工具链应该包含以下4个部分&#xff1a; &#xff08;1&#xff09;编译器 &#xff08;2&#xff09;汇编器 &#xff08;3&#xff09;链接器 &#xff08;4&#xff09;lib库 在GNU工具链中&…

3.5.2 __ipipe_init()之完成中断处理程序设置

点击查看系列文章 》 Interrupt Pipeline系列文章大纲-CSDN博客 原创不易&#xff0c;需要大家多多鼓励&#xff01;您的关注、点赞、收藏就是我的创作动力&#xff01; 3.5.2 __ipipe_init()之完成中断处理程序设置 __ipipe_init()最核心的就是__ipipe_enable_pipeline()&am…

Mybatis自定义TypeHandler,直接存储枚举类对象

在这篇文章中&#xff0c;我们已经知道如何使用枚举类直接接受前端的数字类型参数&#xff0c;省去了麻烦的转换。如果数据库需要保存枚举类的code&#xff0c;一般做法也是代码中手动转换&#xff0c;那么能不能通过某种机制&#xff0c;省去转换&#xff0c;达到代码中直接保…

PowerMill 2025简体中文版百度云资源分享下载

如大家所了解的&#xff0c;PowerMill是一款专业的CAM&#xff08;计算机辅助制造&#xff09;软件。主要用于加工行业&#xff0c;可以帮助用户进行高效、精准的加工工艺设计和数控编程&#xff0c;以达到生产部件的高精度和高质量。 对于初次接触的小伙伴来说&#xff0c;目…

k均值vs高斯混合模型

K均值&#xff08;K-means&#xff09;和高斯混合模型&#xff08;Gaussian Mixture Model, GMM&#xff09;是常用的聚类算法。 K均值是非概率模型&#xff0c;根据&#xff08;欧氏&#xff09;距离判断&#xff0c;类比最小距离分类器&#xff08;分类&#xff09;。高斯混…

240922-chromadb的基本使用

A. 基本使用 ChromaDB 是一个专门为向量数据库和嵌入查询优化的数据库。它可以与嵌入模型结合使用&#xff0c;存储和查询高维向量数据&#xff0c;通常用于大规模语义搜索、推荐系统等领域。 以下是使用 ChromaDB 的步骤&#xff1a; 1. 安装 ChromaDB 你可以通过 pip 安装…

96. UE5 GAS RPG 实现闪电链技能(一)

闪电链有一个施法的过程&#xff0c;就是在按键按下的过程&#xff0c;会在按下的过程一直持续造成伤害&#xff0c;一直等到条件不满足&#xff08;技能键位抬起&#xff0c;蓝量不足&#xff0c;被眩晕&#xff09;时&#xff0c;将结束技能&#xff0c;并退出技能状态。 所以…

【WSL迁移】将WSL2迁移到D盘

首先查看WSL状态&#xff1a;wsl -l -v 以压缩包的形式导出到其他盘。 wsl --export Ubuntu D:\Ubuntu_WSL\ubuntu.tar 注销原有的linux系统 wsl --unregister Ubuntu 导入系统到D盘 wsl --import Ubuntu D:\Ubuntu_WSL D:\Ubuntu_WSL\Ubuntu.tar 恢复默认用户 Ubuntu co…

如何保护您的机器学习模型

在计算机技术领域&#xff0c;很少有领域像人工智能(AI)和机器学习(ML)一样受到如此多的关注。这门学科位于计算机科学和数据分析的交叉点&#xff0c;已成为移动应用程序、语音助手、欺诈交易检测、图像识别、自动驾驶甚至医疗诊断不可或缺的一部分。 背景介绍由于机器学习模型…

数据结构与算法——Java实现 9.习题——删除链表倒数节点

目录 19. 删除链表的倒数第 N 个结点 方法1 通过链表长度直接删除 方法2 递归加入哨兵节点 ListNode 方法3 快慢指针法 苦难&#xff0c;区区挫折罢了&#xff0c;而我必定站在幸福的塔尖 —— 24.9.22 19. 删除链表的倒数第 N 个结点 给你一个链表&#xff0c;删除链表的倒数第…

预付费计量系统整体概念

1.预付费计量系统整体概念 A Payment Metering System is a collective infrastructure that supports the contractual relationship between a supplier of goods or services and a customer. It includes processes, functions, data elements, system entities (devices a…

鸿蒙 OS 开发零基础快速入门教程

视频课程: 东西比较多, 这里主要分享一些代码和案例. 开关灯效果案例: 开灯 开关灯效果案例: 关灯 Column 和 Row 的基本用法 Entry Component struct Index {State message: string 张三;build() {// 一行内容Row() {// 一列内容Column() {// 文本内容Text(this.mess…

IDEA创建Web项目(详细版)

目录 1 新建Web项目 步骤如下 1 打开idea,选择新建项目 2 点击创建 3 点击项目结构&#xff0c;选择添加模块 ---web 2 配置Tomcat 步骤如下 1 点击Edit Configurations&#xff08;编辑配置&#xff09; 1.1 右上角当前文件下 选择编辑配置 1.2 点击菜单栏中run 选…

宝塔linux 安装code-server指定对应的端口无法访问

这个一般就是nginx搞的鬼&#xff0c;如果服务正常启动&#xff0c;就是访问不了&#xff1b;大概就是宝塔安装的nginx配置没有代理code-server服务对应的端口&#xff0c;一般就是nginx配置文件的问题 安装默认的nginx会有一个配置文件 直接拉到最后会有一行这个&#xff0c…

Linux 文件系统(下)

目录 一.文件系统 1.文件在磁盘上的存储方式 a.盘面、磁道和扇区 b.分区和分组 2.有关Block group相关字段详解 a.inode编号 b.inode Table&#xff08;节点表&#xff09; c.Data blocks&#xff08;数据区&#xff09; d.小结 二.软硬链接 1.软链接 a.软链接的创建…

springboot启动流程之总体流程梳理

springboot的启动流程相当复杂&#xff0c;我们需要先把控整体流程&#xff0c;后面会有若干文章一一讲解springboot启动流程中的重要的细节&#xff0c;springboot的启动经过了一些一系列的处理&#xff0c;我们先看看整体过程的流程图 篇幅有限&#xff0c;我们这里先聊聊实…

N叉树的前序与后续遍历(含两道leetcode题)

文章目录 589. N 叉树的前序遍历递归法迭代法 590. N 叉树的后序遍历递归法迭代法 589. N 叉树的前序遍历 589. N 叉树的前序遍历 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由…

CSP-S 2024 提高组初赛第一轮初赛试题及答案解析

完整试题&#xff0c;CSP-S-2024 CSP-S 2024 提高组初赛第一轮初赛试题及答案解析 一、 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 1 在 Linux 系统中&#xff0c;如果你想显示当前工作目录的…

哔哩哔哩自动批量删除抽奖动态解析篇(一)

本文的分析过程可能需要读者了解一点前后端数据交互和逆向分析的思路和基础&#xff0c;由于本人是新手&#xff0c;自己也处于摸索学习阶段&#xff0c;说的不对或者不好的地方敬请谅解。 一、删除动态流程分析 B站每条动态无论是转发他人的动态还是自己原创发布的动态都有一…

蓝桥杯1.小蓝的漆房

样例输入 2 5 2 1 1 2 2 1 6 2 1 2 2 3 3 3样例输出 1 2 import math import os import sys tint(input())#执行的次数 for j in range(t):n,kmap(int,input().split())#n为房间数 k为一次能涂的个数alist(map(int,input().split()))#以列表的形式存放房间的颜色maxvaluemath…