question1:请按顺序写出打印结果,并说明原因:
var name = 'global';
var obj = {
name: 'local',
foo: function(){
this.name = 'foo';
}.bind(window)
};
var bar = new obj.foo();
setTimeout(function() {
console.log(window.name);
}, 0);
console.log(bar.name);
var bar3 = bar2 = bar;
bar2.name = 'foo2';
console.log(bar3.name);
下面是本人的详细解答以及代码注释:
var name = 'global';
var obj = {
name: 'local',
foo: function() {
this.name = 'foo';
}.bind(window)
};
var bar = new obj.foo();
/*
定时器任务,在最后放入任务队列,setTimeout属于宏观任务
*/
setTimeout(function() {
console.log(window.name)
}, 0);
console.log(bar.name);
/*
此时执行顺序是var bar3,bar2=bar,bar3=bar2,所以bar3/bar2/bar都是指向同一个对象
bar2.name='foo2';
所以bar2修改属性,bar3的也改变,此时输出为foo2
*/
var bar3 = bar2 = bar;
bar2.name = 'foo2';
console.log(bar3.name);
按顺序打印结果:
foo,foo2,global
question2:请写出如下代码运行后产生的结果,并给出解释,说明结果是如何得出的:
setTimeout(() => console.log('a'));
Promise.resolve().then(
() => console.log('b’);
).then(
() => Promise.resolve('c').then(
(data) => {
setTimeout(() => console.log('d'));
console.log('f');
return data;
}
)
).then(data => console.log(data));
// 定时器任务属于宏任务,并且需要先在任务队列等待,等到同步任务执行完,执行栈清空,才会在任务队列中按顺序选任务进去
setTimeout(() => console.log('a'));//4. 打印a
//Promise 属于异步微任务,在本轮同步任务结束之前执行
Promise.resolve().then(
// 1. 打印 b
() => console.log('b') // 单引号要改为',然后去掉;号
).then(
// 箭头函数的resolve传递的参数作为下一个then的参数
() => Promise.resolve('c').then(
// 执行箭头函数
(data) => {
// 把定时器任务也放入任务队列中等待,在第一个定时器之后
setTimeout(() => console.log('d')); //5. 打印d
// 2.打印 f
console.log('f');
// 此时返回的 数据作为下一个then的参数
return data;
}
)
).then(data => console.log(data)); // 3.打印 c
打印bfcad