从三道面试题,看JavaScript底层机制

一、Javascript的执行机制 eventLoop
二、作用域链与引用类型
三、V8引擎内存问题
第一题,输出顺序:
setTimeout(function(){

console.log('set1');

})
new Promise(function(resolve){

console.log('pr1');

resolve()
}).then(function(){

console.log('then1')

})
setTimeout(function(){

console.log('set2');

})
console.log(3);
从三道面试题,看JavaScript底层机制_第1张图片
*微任务与宏任务-微任务会先于宏任务执行,微任务队列空了,才去执行下一个宏任务。
微任务:Promise,process.nextTick
宏任务:整体代码script(第一次执行的代码),setTimeout,setInterval
第一题进阶:
setTimeout(function(){

console.log('set1');
new Promise(function(resolve)       {
    resolve()
}).then(function(){
    console.log('then4')
})

})
new Promise(function(resolve){

console.log('pr1');

resolve()
}).then(function(){

console.log('then1')

})
setTimeout(function(){

console.log('set2');

})
new Promise(function(resolve){
resolve()
}).then(function(){

console.log('then2')

})
console.log(3);
关于async:
async function a(){console.log('async')}
a();
console.log(3)
//async,3
await实际里面执行是同步的,同步异步主要看里面的内容
改动:
async function a(){

//await从使用上来说,必须等待一个Promise
var b=await new Promise(function(resolve){
    resolve(7)
})
console.log(5);
console.log('b')

}
a();
console.log(3)
// 3,5,7:await等待promise,后面的内容不执行了,除非promise的状态变成resolve或rejece,等待完成才会继续执行。
经典闭包题:
for(var i=0;i<10;i++){

setTimeout(()=>{
    console.log(i)//10...
})

}
for(var i=0;i<10;i++){

(function(i){
    console.log(i)//正确输出
})(i)====>将当前的i缓存到setTimeout的缓存作用域里面去了,拿到的是setTimeout局部的i

}
类似上面的错误:var arr=['url','url','url']
//读数组里面的文件
for(var i=0;i

fs.readFile(arr[i],function(){
    //回调里的操作的文件都是最后一个
})

}

你可能感兴趣的:(javascript)