为了账号安全,请及时绑定邮箱和手机立即绑定

这里的setTimeout 0是解决什么问题呢

这里的setTimeout 0是解决什么问题呢

海绵宝宝撒 2019-05-24 18:42:00
if(!this.isShown()){return;}this.$container.trigger('beforeHide.modal.cmp',{modal:this});this.$container.addClass(HIDE_CLS);setTimeout(function(){this.$container.trigger('afterHide.modal.cmp',{modal:this});}.bind(this),0);
查看完整描述

2 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

完整代码大概是:
functionhide(){
if(!this.isShown()){
return;
}
this.$container.trigger('beforeHide.modal.cmp',{modal:this});
this.$container.addClass(HIDE_CLS);
setTimeout(function(){
this.$container.trigger('afterHide.modal.cmp',{modal:this});
}.bind(this),0);
}
这里有一种情况,是addClass之后,对应的样式在hide执行完之前不会生效(只是有可能,各浏览器表现可能还不一样,除了addClass其它一些更改也是类似,如果你像我一样不想去管这里面的细节,类似情况,一个setTimeout也许就足以解决问题,比较偷懒的作法)。
那么,想要达到的一个效果,就像是说,“在hide函数执行完之后,尽快地去做另一件确定的事”,这个“尽快”,就是setTimeout(f,0)的作用了,细节上,你确实是不知道“尽快”到底是什么时候,setTimeout只是确保了这个地方有一个“上下文切换”(这里说的“上下文”跟this那东西不是一回事,指的是“异步”执行的环境)。
那么,在不考虑addClass效果的情况下,这个setTimeout是否多余呢?
如果单看hide,那么它是多余的。但是事实上,你还要看hide被调用时的上下文情况,这里的情况会比较复杂。一个现成的例子,是angular中的$digest调用。$digest调用如果是在一个被“监控”的上下文环境中的话,是会报错的,比如:
点击
$scope.test=function(){
$scope.$digest();//报错
}
套个setTimeout就没问题了:
$scope.test=function(){
setTimeout(function(){
$scope.$digest();
},0);
}
总的来说,setTimeout(f,0)都是一种偷懒的,随意性的方法。
                            
查看完整回答
反对 回复 2019-05-24
?
慕森卡

TA贡献1806条经验 获得超8个赞

这是事件循环机制,当setTimeout的时候,他建立一个setTimeout的队列,会等到当前队列的任务执行完,再执行setTimeout队列的任务
                            
查看完整回答
反对 回复 2019-05-24
  • 2 回答
  • 0 关注
  • 841 浏览
慕课专栏
更多

添加回答

了解更多

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信