js定时器执行
js定时器执⾏
第⼀种:问题请求代表执⾏打印出来的是什么?
//定时器执⾏页⾯崩溃
var bo = true;
421事件是什么setTimeout(function () {
console.log("定时器执⾏");
bo = false;
}, 1000);
while (bo) {
console.log(bo);
}
console.log(bo);
分析:js为单线程执⾏,也到定时器会跳过定时器,执⾏后⾯代码,待定时器事件到在执⾏定时器⾥⾯函数。
上⾯代码的情况,bo为true。页⾯⼀直执⾏while,页⾯卡死。
浏览器内核实现允许多个线程异步执⾏,这些线程在内核制控下相互配合以保持同步.假如某⼀浏览器内核的实现⾄少有三个常驻线
程:javascript引擎线程,界⾯渲染线程,浏览器事件触发线程,除些以外,也有⼀些执⾏完就终⽌的线程,如Http请求线程,这些异步线程都会产⽣不同的异步事件,下⾯通过⼀个图来阐明单线程的JavaScript引擎与另外那些线程是怎样互动通信的.虽然每个浏览器内核实现细节不同,但这其中的调⽤原理都是⼤同⼩异.
第⼆种:最后输出的结果是什么?
//for循环变量
var arr = [1,2,3,4];
for (var i = 0; i < arr.length; i++) {
setTimeout(function () {
console.log(arr[i]);
},1000);
}
console.log(i);
结果为:underfind。
解析:最后执⾏到i为4,arr[4]超出数组。
解决⽅式:
⽅法⼀:
//let 语句声明⼀个块级作⽤域的本地变量,并且可选的将其初始化为⼀个值。
/
/在es6中新增了let命令声明变量,⽤法和var类似,不过let所声明的变量,只在let命令所在的代码块有效果,for循环的计数器中就很适合let命令
for (let i = 0; i < arr.length; i++) {
setTimeout(function () {
console.log(arr[i]);
}, 1000);
}
⽅法⼆:
//加个闭包
for (let i = 0; i < arr.length; i++) {
(function (i) {
setTimeout(function () {
console.log(arr[i]);
}, 1000);
})(i)
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。