JS
未读
事件循环
JS是单线程语言,同一时间只能执行一个任务
如果一个任务耗时过长(网络请求、文件读取),会阻塞后续代码的进行
同步任务:立刻放入JS引擎(JS主线程)执行,原地等待结果
异步任务:先放入宿主环境(浏览器/Node),不阻塞主线程,在将来执行
执行过程
过程中一共有三块环境:执行栈、宿主环境、任务队列
按代码上下文顺序
将同步任务压入执行栈
将异步任务压入宿主环境
在宿主环境中执行时机到来时(比如定时器到期),将宿主环境中异步任务(比如定时器)的回调函数推送给任务队列
此时执行栈会去看任务队列有没有异步任务需要执行,如果有则将异步任务推送到执行栈中执行
执行栈在同步任务执行完后会反复地去任务队列看有没有需要执行的异步任务
这个反复查找的过程就叫事件循环
宏任务/微任务
JS将 异步任务 分为宏任务和微任务
宏任务 由 宿主 发起
script (代码块)
setTimeout / setInterval 定时器
微任务 由 JS引擎 发起
promise (promise内部是同步,then/catch是回调异步)
Asy ...
JS
未读
Proxy
允许你创建一个代理对象来拦截并自定义基本操作(属性查找、赋值、枚举、函数调用等)
怎么用1const proxy = new Proxy(target, handler);
target: 要代理的目标对象。
handler: 一个包含 get/set 等拦截方法的对象。
1234567891011121314151617let target = {};let handler = { get: function(obj, prop) { if (prop in obj) { console.log(`Getting ${prop}: ${obj[prop]}`); return obj[prop]; } else { console.log(`${prop} 属性不存在`); return undefined ...
JS
未读
Promise什么是promise作为异步函数,有四种状态
Pending 进行中(Pending) 用 new Promise() 创建对象
Fulfilled 成功(Resolved) 用 .then() 处理成功的结果
Rejected 失败 (Rejected) 用 .catch() 处理失败
Finally 结束 () 用 .finally() 结束
怎么用异步函数
1234567891011const step_1 = new Promise((resolve, reject) => { //Promise对象 setTimeout(() => resolve("奶茶"), 1000);});const step_2 = (tea) => new Promise((resolve, reject) => { //函数 setTimeout(() => resolve(tea + "+珍珠"), 1000);});const step_3 = (tea) ...
JS
未读
GO?VO?AO?我用 「剧场演出」 来比喻这些概念
GO (Global Object)全局上下文对象(就是全局变量)
12var globalProp = "剧场灯光"; // 🎯 放入GOfunction stageManager() { /*...*/ } // 🎯 放入GO
预编译阶段
1234GO = { globalProp: undefined, // 先摆上道具标签 stageManager: function(){...} // 导演剧本提前挂好}
执行阶段
1234GO = { globalProp: "剧场灯光", // 道具就位 stageManager: function(){...}}
VO (Variable Object)变量对象
每个执行上下文都有
上下文创建到销毁
AO (Activation Object)活动对象
函数调用时临时创建,调用结束销毁
用一个面试题例子来理解12345 ...
技术探索
未读
音视频,音频和视频并不是在一起处理的,而是分开处理至最后合成的音视频
开源脚本 media-source-extract 可以无差别提取网页显示的所有media
media下载后为音频视频双文件
配合 mkvtoolnix 混流器可合成为原视频,感兴趣可以尝试一下
录制原理
播放原理
解封装(分离音视频) → 解码(H.264/AAC → RGB/PCM) → 同步(DTS/PTS 控制播放顺序) → 渲染
位深(单位 | bit)
举个例子:
CSS的颜色通常基于每通道8bit的RGBA模型 👉 rgba(255,255,255,0.5),整体颜色深度为32位
帧率(单位 | fps)帧率即 FPS 每秒有多少帧画面
帧率↑ 流畅↑ 性能需求↑
人眼对图像的暂留时间为 1/24 秒,因此 24fps 被认为是连续的
电影帧率一般是 24fps
电视剧一般是 25fps
监控行业常用 25fps
音视频通话常用 15fps
码率(单位 | Mbps)视频文件在 单位时间内使用的数据流量 。比如1Mbps。
码率 ...
技术探索
未读
FFmpeg实战ffmpeg
Hyper fast Audio and Video encoder 超快音视频编码器 (类似剪辑)
ffplay:
Simple media player 简单媒体播放器
ffprobe:
Simple multimedia streams analyzer 简单多媒体流分析器
处理流程1ffmpeg -i test 1920x1080.mp4 -acodec copy -vcodec libx264-s 1280x720 test 1280x720.flv
ffmpeg命令
复用器和解复用器的区别
复用器(Multiplexer, MUX):(E)
功能:将多个信号或数据流合并成一个单一的信号或数据流进行传输。
应用场景:在数据传输中,复用器常用于将多个低速信号合并为一个高速信号,以便在单一通道上传输,从而提高传输效率。
解复用器(Demultiplexer, DEMUX):(D)
功能:将单个合并后的信号或数据流分解回原始的多个信号或数据流。
应用场景:在数据接收端,解复用器负责将传输过来的合并信号还原为原始的多个信号,以 ...
资源
未读
力扣Hot1001.两数之和for1234567891011121314var twoSum = function(nums, target) { const map = new Map();// 创建一个哈希表用于存储已遍历的数字及其索引 for (let i = 0; i < nums.length; i++) { const now = nums[i]; const oth = target - now;// 目标值的补数 if (map.has(oth)) {// 检查哈希表 return [map.get(oth), i];//返回当前索引和补数的索引 } map.set(now, i);// 将当前数字及其索引存入哈希表 }};
forEach
1>forEach((element, index, array) => { /* … */ })
123456789101 ...
技术探索
未读
前端模块化规范通常来说,一个文件就是一个模块,有自己的作用域,只向外暴露特定的变量和函数。目前流行的js模块化规范有CommonJS、AMD、CMD、UMD以及ES6的模块系统。
AMD / CMD / CommonJs 是JS模块化开发的标准规范,目前对应的实现是
RequireJs / SeaJs / nodeJs
简介CommonJS
CommonJS用同步的方式加载模块。在服务端,模块文件都存放在本地磁盘,读取非常快,所以这样做不会有问题。但是在浏览器端,限于网络原因,更合理的方案是使用异步加载。
NodeJS 是 CommonJS 规范的主要实践者
有4个重要的环境变量为模块化实现提供支持
module
exports
12345678910// 定义模块math.jsvar total = 10;function add(a, b) { return a + b;}// 需要向外暴露的函数、变量module.exports = { add: add, total: to ...
技术探索
未读
nrmnrm(npm registry manager)是npm的镜像管理工具
能帮助你在加载国外的资源太慢时快速切换npm源
安装npm install -g nrm,全局安装nrm
使用查看所有源1nrm ls
显示类似以下信息
1234567* npm ---------- https://registry.npmjs.org/ yarn --------- https://registry.yarnpkg.com/ tencent ------ https://mirrors.tencent.com/npm/ cnpm --------- https://r.cnpmjs.org/ taobao ------- https://registry.npmmirror.com/ npmMirror ---- https://skimdb.npmjs.com/registry/ huawei ------- https://repo.huaweicloud.com/repository/npm/
其中 * 号表示当前使用的源。
切换源相比 npm config set ...
组件库
未读
我的 Vue3 文档内置标签component
动态组件
根据 currentTabComponent 的值判断是否要渲染组件
1<component v-bind:is="currentTabComponent"></component>
keep-alive
每次切换新标签的时候,Vue 都会创建一个新的 currentTabComponent 实例。
1234<!-- 失活的组件将会被缓存!--><keep-alive> <component v-bind:is="currentTabComponent"></component></keep-alive>
slot⭐
子组件的占位符
在父组件引用的中 写入的内容
会被 插进子组件内 并渲染回父组件
12345678910<!-- 父组件 --><Button> <div>这是默认插槽的内容</div></Button><!- ...

