为什么 JS 是单线程, 而不是多线程

举报
上善若水. 发表于 2022/10/30 00:40:55 2022/10/30
1.2k+ 0 0
【摘要】 为什么 JS 是单线程, 而不是多线程单线程是指 JavaScript 在执行的时候,有且只有一个主线程来处理所有的任务。目的是为了实现与浏览器交互。我们设想一下,如果 JavaScript 是多线程的,现在我们在浏览器中同时操作一个DOM,一个线程要求浏览器在这个 DOM 中添加节点,而另一个线程却要求浏览器删掉这个 DOM 节点,那这个时候浏览器就会很郁闷,他不知道应该以哪个线程为准。...

为什么 JS 是单线程, 而不是多线程

单线程是指 JavaScript 在执行的时候,有且只有一个主线程来处理所有的任务。
目的是为了实现与浏览器交互。
我们设想一下,如果 JavaScript 是多线程的,现在我们在浏览器中同时操作一个
DOM,一个线程要求浏览器在这个 DOM 中添加节点,
而另一个线程却要求浏览器删掉这个 DOM 节点,
那这个时候浏览器就会很郁闷,他不知道应该以哪个线程为准。
所以为了避免此类现象的发生,降低复杂度,JavaScript
选择只用一个主线程来执行代码,以此来保证程序执行的一致性。
请说出以下结果输出什么?为什么?

for(var i = 0; i < 5; i++) {
setTimeout(function(){
console.log(i)
}, 0)
}
答案:5个5
解释:异步代码需要等同步代码先执行,所以当异步定时器执行时,
同步的for循环已经循环完毕

请说出以下flag的结果?为什么?

function show(){}

function getName() { return ‘牛夫人’ }

var flag = show() || getName()
答案:flag值为’牛夫人’
解释:1.函数都会有一个默认的返回值undefined
2.逻辑或如果第一个值成立就直接返回第一个值,否则直接返回第二个值

请解释一下什么是重排与重绘?

重排:当改变dom结构的时候,就会从dom树开始从新渲染页面,这过程叫重排比如添加或者删除可见的DOM元素、元素尺寸改变、元素内容改变、浏览器窗口尺寸改变等等
重绘:当改变样式(不改变几何结构)的时候,它会从render树开始重新开始渲染页面,这过程叫重绘,比如改变颜色,透明等
怎么减少重排与重绘?

尽量避免操作DOM元素
避免多次修改dom结构或者css,集中处理,只引发一次重绘或者重排
请解释一下什么是防抖与节流

防抖(debounce)
总结:就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。
节流(throttle)
总结:就是每次触发事件的隔间至少要大于等于n秒,不会重置计时
说一下call、apply、bind三者的作用 与 区别

作用:三者的作用都是可以改变函数的this指向(function对象自带的方法)
区别:1.call、apply会直接调用原函数,bind不会直接调用函数,而会拷贝一份返回一个新函数
call、bind传参时一个个传入,而apply是把所有参数放到一个数组中传入
JS严格模式的使用与作用
答案:在代码前面使用"use strict"就可以开启严格模式;

作用:

消除 Javascript 语法的一些不合理、不严谨之处,减少一些怪异行为;
消除代码运行的一些不安全之处,保证代码运行的安全;
提高编译器效率,增加运行速度;
为未来新版本的 Javascript 做好铺垫。
举例JS严格模式的特点

变量必须要通过修饰符进行声明
函数的参数不能有同名属性,否则报错
禁止 this 指向全局对象
增加了保留字(比如 protected 、 static 和 interface )
不能删除变量 delete prop
执行下面代码打印什么?为什么?

var a = {};
var b = {key: ‘b’};
var c = {key: ‘c’};
var d = [3,5,6];
a[b] = 123;
a[c] = 345;
a[d] = 333;
console.log(a[b]);
console.log(a[c]);
console.log(a[d]);
console.log(a[b]); // 打印:345
console.log(a[c]); // 打印:345
console.log(a[d]); // 打印:333
为什么:对象转化字符串会变成一个’[object Object]’

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。