- 执行顺序题
第一题
```javascript let obj = { num1: 117 } let res = obj; obj.child = obj = { num2: 935 }; var x = y = res.child.num2; console.log(obj.child); console.log(res.num1); console.log(y);
// undefined // 117 // 935
<a name="m28bH"></a>
### 第二题
```javascript
async function async1(){
console.log('async1 start')
await async2()
console.log('async1 end')
}
async function async2(){
console.log('async2')
}
console.log('script start')
setTimeout(function(){
console.log('setTimeout')
},0)
async1()
new Promise((resolve)=>{
console.log('promise1')
resolve()
}).then(function (){
console.log('promise2')
})
console.log('script end')
// script start
// async1 start
// async2
// promise1
// script end
// async1 end
// promise2
// setTimeout
第三题
Promise.resolve().then(()=>{
console.log('第一个回调函数:微任务1')
setTimeout(()=>{ console.log('第三个回调函数:宏任务2') },0)
})
setTimeout(()=>{
console.log('第二个回调函数:宏任务1')
Promise.resolve().then(()=>{ console.log('第四个回调函数:微任务2') })
},0)
// 微任务1
// 宏任务1
// 微任务2
// 宏任务2
第四题
console.log("start");
async function async1() {
console.log("async1 start");
await async2();
console.log("async2 end");
await async3();
console.log("async3 end");
}
function async2() {
console.log("async");
}
function async3() {
console.log("async3 start");
}
console.log("scrpit start");
setTimeout(() => {
console.log("setTimeOut");
}, 0);
async1();
new Promise(function (reslove) {
console.log("promise1");
reslove("promise2");
}).then((res) => {
console.log(res);
});
console.log("script end");
// start
// script start
// async1 start
// async
// promise1
// script end
// async1 end
// async3 start
// promise2
// async3 end
// setTimeout
第五题
let promiseFunc = function () {
return new Promise((resolve, reject) => {
console.log(this.name);
setTimeout(function () {
console.log(this.name);
console.log('abc');
resolve('cba');
}, 2000);
console.log('aaa');
});
};
let Object1 = {
name: 'james',
func: promiseFunc,
};
Object1.func().then((result) => {
console.log('result', result);
});
// james
// aaa
// undefied(箭头函数的this向上查找到第一个函数作用域,Promise的回调函数的this没有name)
// abc
// resolve(cbd)后执行then
// result,cbd
第六题
console.log('start here');
const foo = () => {
return new Promise((resolve, reject) => {
console.log('first promise constructor');
let promise1 = new Promise((resolve, reject) => {
console.log('second promise constructor');
setTimeout(() => {
console.log('setTimeout here');
// 这里的resolve会触发哪里的then,还是说不触发
resolve();
}, 0);
resolve('promise1');
});
resolve('promise0');
promise1.then((arg) => {
console.log(arg);
});
});
};
foo().then((arg) => {
console.log(arg);
});
console.log('end here');
// start here
// fisrt
// second
// end here
// promise1
// promise0
// setTimeout here
第七题
console.log('Script开始')
setTimeout(() => {
console.log('第一个回调函数,宏任务1')
Promise.resolve().then(function() {
console.log('第四个回调函数,微任务2')
})
}, 0)
setTimeout(() => {
console.log('第二个回调函数,宏任务2')
Promise.resolve().then(function() {
console.log('第五个回调函数,微任务3')
})
}, 0)
Promise.resolve().then(function() {
console.log('第三个回调函数,微任务1')
})
console.log('Script结束')
// script开始
// script结束
// 微任务1
// 宏任务1
// 宏任务2
// 微任务2
// 微任务3
第八题
console.log('Script开始')
setTimeout(() => {
console.log('宏任务1(setTimeout)')
Promise.resolve().then(() => {
console.log('微任务promise2')
})
}, 0)
setImmediate(() => {
console.log('宏任务2')
})
setTimeout(() => {
console.log('宏任务3(setTimeout)')
}, 0)
console.log('Script结束')
Promise.resolve().then(() => {
console.log('微任务promise1')
})
process.nextTick(() => {
console.log('微任务nextTick')
})
// script开始
// script结束
// 个人错误答案
// 微任务1
// 微任务NextTick
// 微任务nectTick
// 微任务1
// 宏2 setImmediate
// 宏1
// promise2
// 宏3
第九题
async function async1 () {
console.log('async1 start');
await new Promise(resolve => {
console.log('promise1')
resolve('promise1 resolve')
}).then(res => console.log(res))
console.log('async1 success');
return 'async1 end'
}
console.log('srcipt start')
async1().then(res => console.log(res))
console.log('srcipt end')
// script start
// async1 start
// promise1
// script end
// promise1 resolve
// async1 success
// async1 end