前端-深入了解前端

news/2025/1/15 18:50:09/文章来源:https://www.cnblogs.com/skybreak/p/18409782

JavaScript的Event Loop概念

JavaScript 的 Event Loop(事件循环)是其执行模型的核心机制,确保了异步操作和事件的处理能够在单线程环境下顺利进行。让我们详细解释 Event Loop 的工作原理,并探讨在 setTimeoutPromise 同时存在时,谁先执行。

Event Loop 的工作原理

  1. 调用栈(Call Stack):

    • JavaScript 使用调用栈来执行代码。当函数被调用时,它会被推入栈中,函数执行完毕后会从栈中弹出。
  2. 任务队列(Task Queue / Callback Queue):

    • 任务队列存储需要被执行的异步任务。常见的任务有 setTimeoutsetInterval 和 I/O 事件处理等。
  3. 微任务队列(Microtask Queue / Job Queue):

    • 微任务队列主要用于处理 Promise 的回调函数。微任务具有比宏任务(如 setTimeout)更高的优先级。
  4. 事件循环(Event Loop):

    • 事件循环不断检查调用栈是否为空。如果调用栈为空,事件循环会从任务队列中取出任务执行。

setTimeout 和 Promise 的执行顺序

在 JavaScript 中,当 setTimeoutPromise 同时存在时,它们的执行顺序受以下因素影响:

  1. 宏任务(Macrotask):

    • setTimeout 属于宏任务。宏任务在任务队列中执行,并且在每次事件循环的宏任务阶段执行。
  2. 微任务(Microtask):

    • Promise 的回调函数(如 thencatchfinally)属于微任务。微任务会在当前任务执行完成后,调用栈为空时立即执行。

执行顺序

  1. 同步代码:

    • 直接在调用栈中执行。
  2. 微任务:

    • 在当前同步代码执行完毕后,且在任何宏任务之前,微任务会被执行。
  3. 宏任务:

    • 之后会处理宏任务队列中的任务,如 setTimeout

示例代码

javascript复制代码
console.log('Start');setTimeout(() => {console.log('Timeout');
}, 0);Promise.resolve().then(() => {console.log('Promise');
});console.log('End');

解释:

  1. console.log('Start') 被立即执行。
  2. setTimeout 回调函数被设置为 0 毫秒后执行,并且会被添加到宏任务队列中。
  3. Promise.resolve().then 的回调函数被添加到微任务队列中。
  4. console.log('End') 被立即执行。

执行顺序:

  1. console.log('Start') - 立即执行。
  2. console.log('End') - 立即执行。
  3. 微任务(Promise) - 在当前执行上下文完成后,微任务会被处理,打印 Promise
  4. 宏任务(setTimeout) - 微任务执行完后,事件循环会处理宏任务,打印 Timeout

所以,Promise 的回调函数会在 setTimeout 的回调函数之前执行,即使 setTimeout 的延迟时间设置为 0 毫秒。微任务总是会在宏任务之前执行,这是 Event Loop 的设计决定的。

总结

  • Event Loop 确保了 JavaScript 的异步操作能够在单线程环境下正确执行。
  • 微任务(如 Promise 的回调)优先于 宏任务(如 setTimeout)执行。
  • 当 setTimeout 和 Promise 同时存在时,Promise 的回调会先于 setTimeout 的回调执行。

 

setTimout中执行死循环和promise.then执行死循环哪个会卡死

都会卡死,两者的主要区别在于它们的任务队列优先级和影响范围:

  1. setTimeout 中的死循环:

    • 优先级:setTimeout 的回调属于宏任务队列。宏任务在微任务(Promise.then)之后执行。
    • 影响:当主线程在执行 setTimeout 回调中的死循环时,所有其他宏任务和微任务都会被延迟,直到当前的宏任务(即死循环)完成。
  2. Promise.then 中的死循环:

    • 优先级:Promise.then 的回调属于微任务队列。微任务在当前执行栈完成后、下一个宏任务之前执行。
    • 影响:当主线程在执行 Promise.then 回调中的死循环时,所有微任务会被阻塞,因此后续的微任务和宏任务(如 setTimeout)也会被延迟,直到当前的微任务(即死循环)完成。

简单来说,setTimeout 中的死循环会影响所有的任务,包括微任务和宏任务,但 Promise.then 中的死循环主要影响微任务的执行,并间接影响宏任务的开始。

 什么是CSP

Content Security Policy (CSP) 通过定义明确的资源加载策略来防止 XSS(跨站脚本攻击)。它的核心思想是限制网页能够从哪些来源加载资源,如脚本、样式、图片等。以下是 CSP 如何实现防止 XSS 的具体机制:

1. 限制脚本来源

CSP 允许开发者指定哪些来源的脚本可以被加载和执行。这通过 script-src 指令来实现。例如:

http复制代码
Content-Security-Policy: script-src 'self'

这条策略表示只允许从当前网站加载脚本。其他来源(例如,外部广告脚本、第三方分析脚本)将被禁止,从而减少了 XSS 攻击的可能性。

2. 禁用内联脚本和事件处理器

CSP 可以通过禁用内联脚本和内联事件处理器来防止攻击者通过注入恶意脚本来执行 XSS 攻击。通过使用 'strict-dynamic''nonce-<random>''hash-<base64>',可以防止未授权的内联脚本执行。

  • 'nonce-<random>':允许只有在页面生成时设置的特定 nonce 值的脚本执行。例如:

    html复制代码
    <script nonce="random123">console.log('safe script');</script>
    

    CSP 头部设置为:

    http复制代码
    Content-Security-Policy: script-src 'self' 'nonce-random123'
    
  • 'strict-dynamic':允许在加载脚本时,只有在严格模式下(如来自授权来源的脚本)才执行该脚本。这会进一步限制未被授权的脚本的执行。

3. 限制样式来源

类似于脚本的限制,CSP 允许限制样式表的来源,通过 style-src 指令。例如:

http复制代码
Content-Security-Policy: style-src 'self'

这条策略会阻止加载来自未授权来源的样式表,减少了 CSS 中可能存在的 XSS 漏洞。

4. 阻止不安全的资源

CSP 可以阻止加载不安全的资源,如不加密的 HTTP 请求。通过设置 upgrade-insecure-requests 指令,所有的 HTTP 请求会被自动升级为 HTTPS,减少中间人攻击的风险:

http复制代码
Content-Security-Policy: upgrade-insecure-requests

5. 资源完整性检查

CSP 允许开发者为脚本和样式定义哈希值或使用 integrity 属性进行完整性检查。这确保了加载的资源未被篡改。

6. 防止数据注入

通过 frame-ancestors 指令,可以指定允许嵌套页面的来源,这有助于防止点击劫持攻击(clickjacking)。例如:

http复制代码
Content-Security-Policy: frame-ancestors 'none'

这表示禁止任何页面嵌套当前页面。

总结

CSP 通过细粒度的控制策略限制网页加载和执行的资源,防止了恶意脚本和数据注入,从而大大减少了 XSS 攻击的风险。开发者可以通过设置和调整 CSP 策略来保护他们的应用免受各种攻击。

CSP 不能阻止浏览器插件的注入。浏览器插件通常有更高的权限,可以绕过 CSP 的限制。插件的代码运行在浏览器的不同上下文中,因此 CSP 对它们的行为没有直接影响。

 

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

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

相关文章

springboot启动apache版本报错

springboot An incompatible version [1.2.32] of the Apache Tomcat Native library is installed, while Tomcat requires version [1.2.34] 解决办法: 到tomcat的链接地址,找对应的版本 http://archive.apache.org/dist/tomcat/tomcat-connectors/native/ 找到1.2.34下的 …

算法 - 课程笔记

调度问题插入排序分治法 分治法是将原问题划分为多个规模较小的子问题,这些子问题可以独立求解,将子问题的解进行综合得到原问题的解。算法设计一般使用递归算法,算法分析一般使用递归表达式。归并排序 归并排序,就是分组再合并,将一个数组等分为左右两个子数组,然后再使…

学弟去字节面试,一小时被问了 50 题。。

分享一下我问的题目,大家也可以试着答答看。大家好,我是程序员鱼皮。昨天直播面试了一位 25 届的学弟,暂且就叫他 “阿强” 吧。 阿强非常优秀,不仅有半年的实习经历、有自己的项目,而且还参加过大厂(字节)的面试。 面试开场前,我问学弟:你上次面试字节时,感受如何?…

绩效考核中如何做自我评估

绩效考核中,员工的自我评估是一个重要环节。如何能将自己的现状,表现,能力等等用文字表达出来,是很多员工的痛苦。国外很多研究中,给了我们很多启示,今天就让我们来介绍一下海外在员工自我评估中的一些研究成果。自我评估的重要性 自我评估对员工和管理者同样有用。评估通…

为什么chrome有时候无法访问github?——RuTracker插件的代理功能会让浏览器无法访问github

去插件那里把代理关掉就行了(把滑块点成灰色) 也可以开个无痕模式,无痕的黑窗口会忽略一些插件

PbootCMS后台访问地址及默认帐号密码是多少

PBootCMS 的后台默认账号和密码通常会在官方文档或开发手册中给出。如果你在源码包中没有找到相关信息,可以参考以下默认设置: 默认后台访问路径后台访问路径:http(s)://yourdomain.com/admin.php将yourdomain.com替换为你的实际域名。默认账号和密码初始账号:admin 初始密…

pbootcms升级提示 执行SQL发生错误!错误:duplicate column name: picstitle

当你在升级PBootCMS时遇到“执行SQL发生错误!错误:duplicate column name: picstitle”的问题,这通常表示在升级过程中,数据库表结构的变更脚本未能正确执行,导致新的字段名称与现有字段冲突。以下是如何解决这个问题的一些步骤: 解决方案备份数据库:在进行任何数据库操…

pbootcms伪静态设置教程含apache、naginx、IIS不同环境配置规则

其实pbootcms伪静态已经整理好, 在根目录就可以找到 作为使用者, 只需要根据不同的服务器环境, 使用不同格式的数据就行。 naginx #请复制下面伪静态配置到nginx配置文件中: #规则适合PbootCMS V2.0+版本location / {if (!-e $request_filename){rewrite ^/(.*)$ /index.ph…

van-checkbox + dialog

<van-dialogv-model="showParkingLot"title="选择"show-cancel-buttoncancelButtonText="取消"confirmButtonColor="#2e7cf9"@confirm="confirm"><div class="p10"><van-checkbox-groupv-model=&q…

腾讯云升级多个云存储解决方案 以智能化存储助力企业增长

9月6日,在腾讯数字生态大会腾讯云储存专场上,腾讯云升级多个存储解决方案:Data Platform 数据平台解决方案重磅发布,数据加速器 GooseFS、数据处理平台数据万象、日志服务 CLS、高性能并行文件存储 CFS Turbo 等多产品全新升级,能够为企业在 AI 时代提供更安全、高效的数据…

PbootCMS详情页里上一篇下一篇的“没有了”在哪里改啊

扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网站改版、BUG修复、问题处理、二次开发、PSD转HTML、网站被黑、网站漏洞修复等。专业解决各种疑难杂症,您有任何网站问题都…