当前位置: 首页 > 知识库问答 >
问题:

前端 - 浏览器中执行的scratch,是如何让角色可以同时做多件事的?

东门文斌
2024-02-06

浏览器中执行的scratch,是如何让角色可以同时做多件事的?

首先简单介绍一下scratch,scratch是一个图形化编程语言,通过拖拽积木的方式来完成编程,一般用于少儿编程。官网

scratch应该是使用web技术(html,css,js)来构建的,js是一个单线程的语言,怎么让一个角色同时执行多件事呢?
就比如下面所示,在小猫这个角色上,当我点击小绿旗的时候,同时会有两个脚本在执行,一个让它移动,一个让它变化造型。

  • 这两个脚本真的处于两个线程吗?
  • 将角色渲染到页面上应该还需要一个新的线程,要不然什么时候渲染,这两个脚本都是无线循环的。那么渲染是什么时候发生的?
  • 程序中往往存在很多的角色,也就说要有很多的线程?

image.png

共有2个答案

阎志义
2024-02-06

不是很了解你说的scratch,但是我试着回答一下你的问题:
1.
这两个脚本真的处于两个线程吗?
两个脚本一个让它移动,一个让它变化造型,也就是说操作了页面的DOM节点,那么应该不是Web Worker在后台线程中运行脚本(因为它不能操作DOM节点),实际上应该还是通过JS的异步任务队列先后执行、浏览器的渲染UI线程先后渲染的,只不过速度很快你看不出来,本质上还是属于JS的单线程范围
2.
将角色渲染到页面上应该还需要一个新的线程,要不然什么时候渲染,这两个脚本都是无线循环的。那么渲染是什么时候发生的?
渲染到页面上的线程是浏览器的GUI渲染线程,这两个脚本准确的说应该是一直重复执行完再被触发的过程,JS通过异步任务队列先后执行脚本操作改变页面的DOM节点后,GUI渲染线程就会进行渲染,这两个过程是互斥的,不可能一边操作DOM节点一边渲染
3.
程序中往往存在很多的角色,也就说要有很多的线程?
要明确一点,JS是单线程的,而浏览器不是。浏览器有事件触发线程、定时触发器线程等线程来做到把任务加入JS引擎的异步执行队列,还是一样的道理:只要执行的够快,你就看不出来。

萧伟兆
2024-02-06

微任务或者宏任务模拟的吧。

浏览器其实也有办法,比如说用 worker,但是感觉没必要。盲猜是模拟的

当然,如果让我自己做这样一个东西,无非就是执行两次 addeventlistener,你可以用 jquery 体验一下

 类似资料:
  • 问题内容: 是否有可用的编程库来解析HTML文档,执行JavaScript,然后允许我浏览DOM?这需要在服务器端而非客户端执行。任何语言都可以,但是首选Java,PHP或Ruby。 问题答案: 在Java中:http : //lobobrowser.org/cobra/java-html- parser.jsp 这是一个可识别Javascript,可识别CSS的HTML解析器 ,它与您的问题有关

  • 问题内容: 我正在寻找一种在客户端(即在浏览器中)进行traceroute的方法。 据我所知,不可能通过Javascript或Flash发送具有任意TTL值的ICMP,UDP或TCP数据包。我知道Flash允许通过Actionscript中的Socket类进行TCP连接,但是它对于traceroute实现似乎没有用。 是开发浏览器插件的唯一解决方案吗? 编辑 :我刚刚发现它已经用Java小程序完成

  • 问题内容: 使用量角器,如何设置/添加并行浏览器进行测试。 示例: 不仅对,还对?还有针对移动设备的简单测试方法吗?说ios8野生动物园还是移动Chrome? 题: 如何编写exports.config对象以支持并行套件测试? 问题答案: 使用量角器,如何设置/添加并行浏览器进行测试。 您需要在以下位置列出浏览器: 还有针对移动设备的简单测试方法吗?说ios8野生动物园还是移动Chrome? 一种

  • 问题内容: 浏览器将下载HTML页面中指定的资源的最大并发连接数是多少?它随浏览器/浏览器/连接速度的不同而不同吗? 问题答案: 简短的答案是“每个域大约4到6个连接” 有关更多详细信息,请查看有关每个浏览器将与给定域建立多少个并行连接的概述。 结果总结如下…

  • 问题内容: 我想知道是否有任何可用资源描述浏览器的光标如何执行Javascript。 我知道它会在页面加载时加载并执行标签,并且您可以将函数附加到各种窗口事件,但是事情变得模糊的是,例如,当我通过AJAX检索远程页面并将其内容放入div中时。 如果该远程页面必须加载脚本库(例如),则何时加载“ anotherscript.js”并执行其内容? 如果我在当前页面上包含“ anotherscript.

  • 我尝试了以下testng.xml文件,它指向一个运行类,然后指向多个特性文件,但没有成功:/