有关 setTimeout没有延时 立即执行的问题

先上一个简单的例子:

var example = document.getElementById("example");
  function toRed(obj) {
  obj.style.background = "red";
}
//方法1
setTimeout(toRed(example),2000);
//方法2
setTimeout(function() {
    toRed(example);
 }, 2000);

功能上就是想实现在2000ms之后将example这个div背景变红。
效果是方法1,没有进行时延,直接变红,看不到任何延时,而第二个则没有任何问题。
这个问题明显超出了我平时的认知范围,那么问题出在哪里了呢?

1.难道必须用function(){}这样?

答案当然不是。
那么我的方法1哪里不对了呢?因为函数名后面写了()。
对的,加了()就是直接执行了的。
突然想起来之前写的没有问题的都是不加()的函数名放在哪里。
但我这里为什么加了?因为函数必须传入参数obj才知道对谁改变背景颜色呀?这该怎么办?

2.怎么处理这种需要传入参数的函数?

我能想到:

  1. 如方法2一般,加上function(){}包裹住,那么就好啦,这样就是个异步函数啦
  2. 看下面的代码
setTimeout("toRed(example)",2000);

有什么区别?其实是多了个“”把函数给包起来了,这样也可以顺利的时延2000ms再变颜色啦。
那么这个的原理是什么呢?
其实传入字符串之后,js自动会用eval函数对其进行执行,如果不加“”那么就会直接执行了。

结论

以后我再写setTimeout还是要小心点,不能随随便便把有参数的函数放在哪里,还是加个function(){}包裹这最为稳妥,就像我用到addEventListener的时候,如果不包裹一下,里面该传入的e要不就传不进去,要不就你本来不能用参数啦。

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,312评论 0赞 1
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,547评论 0赞 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,261评论 19赞 139
  • JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInt...
    晚晴幽草阅读 1,740评论 1赞 18
  • 这次去加拿大,和在加生活的朋友相聚,回国前朋友带我去了一家超市,COSTCO。仓储式的超市,面积并不是很大,很多货...
    海若音阅读 1,231评论 0赞 0

友情链接更多精彩内容