1.执行下面代码会输出什么信息并简单出过程 (百度金融)
function foo(){ console.log(a);}
function bar(){ var a = 3;foo();}
var a = 2;
bar();
最初思考的答案:a = 2 ,调用bar()函数,进入执行foo函数,而a重新赋值为3.
正确答案:bar()执行时,自身作用域的a = 3 ,但是foo()执行而foo里 console.log(a)为全局的a变量 而不是 bar作用域里的a变量 因此 结果为2。
考点:词法作用域
2.执行下面代码会输出什么信息并简答出过程 (百度金融)
setTimeout(() => {
console.log(100);
}, 0);
console.log(200);
Promise.reject(function(){
console.log(300);
})
最初思考的答案: settimeout最后执行。 所以是 200 300 100
正确答案:首先要了解宏任务和微任务。
宏任务主要包含:script( 整体代码)、setTimeout、setInterval、I/O、UI 交互事件、
setImmediate(Node.js 环境)
微任务主要包含:Promise、MutaionObserver、process.nextTick(Node.js 环境)
1. setTimeout ==》你是宏任务,发现任务源,你的带着你的回调函数去宏任务里排队吧
2. console.log(200);==>你是 主线程任务 立刻执行把 console.log(200) =====顺序1
3. romise.reject ==》你是promise 微任务 去微任务里排队吧
4. 后面的没有兄弟了,那我要先执行完微任务才能执行宏任务
5. 我要执行微任务:Promise Promise.reject 无法catch到 那就报错
把 Uncaught blaba。。。 =======顺序2
6. 报告微任务结束了,已清空所有微任务。那我们可以去执行宏任务了吧。
7. 执行宏任务: setTimeout的回调函数 console.log(100); =======顺序3
考点: EventLoop