博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
当SetTimeout遇到了字符串
阅读量:5924 次
发布时间:2019-06-19

本文共 1415 字,大约阅读时间需要 4 分钟。

今天闲来没事的时候,去逛逛segementFault,看了看别人提的问题。说到setTimeout和window.onload冲突。一开始我是挺疑惑他表他什么意思的,因为setTimeout和window.onload应该不会有明显的冲突吧。带着疑惑去追问。后来贴出代码的时候我就明白了,来看看他的代码中的疑惑吧。

window.onload=function(){setTimeout("D.style.background='#990033'",2000);}

他觉得这个代码运行的时候,setTimeout会报错,不能正确的运行指定的代码,就觉得在window.onload和setTimeout有冲突。

我对这个问题非常感兴趣。也自己试了一下,发现确实不能运行字符串里面的代码。但是还是很怀疑window.onload和setTimeout怎么可能会有冲突呢?

解决问题

为了测试方便,我就稍微改动了一下代码。将setTimeout的调用改成调用函数。

window.onload = function() {    function myFun(i) {        alert(1);    }    setTimeout('myFun(1)', 2000);}

在这里发现的确不能运行,但是这里的问题就很明显了,我将函数的调用变成了 'myFun(1)' 字符串调用,所以会出现不能调用 myFun() 的问题。

为了深入理解我们在查询一下setTimeout的。

那么就是setTimeout只能接受函数或者是表达式的计算。那么现在答案很明显了,既是setTimeout不支持第一个参数为字符串的调用。

但是按照提问者的用法,这种 "D.style.background='#990033'" CSS的调用也必须准守这种形式那么怎么办?

那么就服从setTimeout的规则,说干就干,将他装换成函数就好了。见以下代码。

window.onload=function(){setTimeout(function(){    D.style.background='#990033'},2000);}

这里的2秒钟之后就会执行setTimeout里面的匿名函数,即准守了setTimeout的原则,也可以利用setTimeout来调用类似字符串的形式的功能代码。

回到提问并且深入挖掘

回到提出的问题上来,深入的挖掘,其实并不是setTimeout和window.onload有冲突,在原来的问题中,其实是Javascript作用域在作怪。

在原先的问题中,如果是 setTimeout("D.style.background='#990033'",2000); 的话,由于setTimeout的第一个参数支持的是函数或者是表达式,所以字符串会被自动执行 new Function ,将这个字符串强制转换成一个函数。

我们知道在Javascript中,函数里面有自己的作用域,和外界的作用域不同,而在函数内部并没有D.style.background这个对象,所以会有报错。在我变化的例子中,也是如此,如果使用了 setTimeout('myFun(1)', 2000),那么这里面的字符串就会被自动执行 new Function ,所以创建出来的函数不在这个作用域内,当然也就不能调用,会出现无法找到的问题了。

转载地址:http://sgavx.baihongyu.com/

你可能感兴趣的文章
助力AIoT,雅观科技发布空间智能化操作系统
查看>>
博鳌“‘AI+时代’来了吗”分论坛,嘉宾们有何重要观点? ...
查看>>
机器视觉技术在表面缺陷检测方面的发展趋势
查看>>
网站计数器 web映射
查看>>
好程序员技术文档HTML5开发中的javascript闭包
查看>>
python设计模式(十四):模板方法模式
查看>>
操作系统与多核处理器
查看>>
python应用POP3、IMAP、SMTP 协议,获取邮箱验证码
查看>>
阿里云一键建站产品,阿里云自营建站-中小企业建站首选
查看>>
Vue 组件实例属性的使用
查看>>
网站跳出率的相关要点介绍
查看>>
zookeeper和etcd有状态服务部署
查看>>
SAP如何查看会计凭证
查看>>
Kubernetes共享使用Ceph存储
查看>>
Mybatis-Generator(MBG)教程与Idea的MBG插件
查看>>
Nats的消息通信模型
查看>>
NATS服务器部署及测试
查看>>
Kubernetes-基于Helm安装部署高可用的Redis
查看>>
unity3d Json解析工具类
查看>>
共轨之家获吉利家族基金新一轮融资 5个月前曾获磐霖资本领投A轮融资
查看>>