1.死循环问题
会导致浏览器卡死,无响应
会导致内存溢出???
内存溢出一定是栈用多了,在js开发里面什么东西会占用内存(对象,变量)
变量在栈上,对象在堆上
while(1){
let a=1;//这个是块级作用域,进入作用域变量创建,离开作用域变量会被销毁,也就是内存进入了,出去消失了这样的循环的
var a=1;//如果用var来声名,var会提升作用域,仍然是操作一个变量,内存进入,出去小时
}
死循环会导致线程忙死因为有很多事要做,cpu会做指令行问题比如加法减法这种,
死循环就会导致cpu进去了出不来了,反复对相同指令不断操作,因此会导致主线程长期被占用,包括js语言,css渲染,html解析,包括布局树的生成都是在主线程之内进行操作的,所以说浏览器有个渲染主线程这个渲染主线程会做很多的事情,由于忙着去执行js代码很多其他事情就执行不了了,就会看到浏览器一直在那转圈圈,这个时候点任何按钮都是没有响应的去复制页面上的东西也不会有反应,就是页面点不动了
关联到浏览器的进程模型,事件循环问题
下面这题:
第一题:
while(1){
await 1;
}
是等待一个异步操作,也会卡死,没有将主线程交出
第二题:
function delay(duration=1000){
return new Promise(resolve=>{
setTimeout(resolve,duration);
})
}
while(1){
await delay(0);
}
这个不会导致主线程被占用,也不会被卡死
2.无限递归
会导致栈溢出
第一题:
function delay(duration=1000){
return new Promise(resolve=>{
setTimeout(resolve,duration);
})
}
function m(){
await 1;
m();
}
m();
每次调用自身函数,都会创建一个执行上下文,上次的函数还没执行完,又调用了新的执行函数创建执行上下文,就导致执行栈不断堆积,一直到占满溢出,执行栈的空间是固定的