本人面某大厂第二面的部分技术问题及解答

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值