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

setTimeout第一个参数执行域的问题

setTimeout第一个参数执行域的问题

不负相思意 2019-04-19 22:15:56
最开始写的代码是这样的,后来找到原因说setTimeout是window方法,而a是私有域里的,所以找不到。(function a(){document.write('1');setTimeout('a()',2000);})();但为什么改为下面的写法就可以了呢?(function a(){document.write('1');setTimeout(a,2000);})();不介意多讲讲,谢谢。
查看完整描述

10 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

setTimeout函数的第一个参数可以是Function, 也可以是String代码字符串。string写法是不推荐的,但可以运行。如果是传入string,解析后变量的作用域就找不到了,只能直接在全局作用域中查找,这跟setTimeout是全局函数没有关系;你的第二种写法是传递的Function,它会从当前作用域向上查找。实名函数在自身作用域内可以调用自己,递归函数就经常这样写function a() {a();};所以setTimeout 可以调用它,a里面所有函数都能调用a。

查看完整回答
反对 回复 2019-05-13
?
慕运维8079593

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

不好意思,最近没上csdn, 复合型变量按值传递setTimeout(a, 2000), a变量这里指向一个内存地址,当然能找到他的作用域,但是如果你写setTimeout("a()", 2000),这里的a()仅仅是一个字符串,按值传递,下次调用或者运行的时候内存在哪已经不能确定了,肯定找不到作用域的啊。

查看完整回答
反对 回复 2019-05-13
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

1),你自己也说了是()括起后a是私有setTimeout第一个参数是字符串时,调用到的函数必须是window作用域下的,所以访问不到a函数

2)函数作为setTimeout参数时,内部肯定可以访问到a函数,在同一个作用域内,所以不会报错


查看完整回答
反对 回复 2019-05-13
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

setTimeout只要在执行时能访问到函数就不会报错,不用一定在window作用域下的。就当前作用域找最近的函数,window下即使有函数a,也不会引用到,只是当前作用域下的a。这个是作用域的问题,就近访问最先访问到的,找不到就报错。字符串代码时需要函数,变量都是window下的

查看完整回答
反对 回复 2019-05-13
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

第一种写法是有问题的。setTimeout('a()',2000);加了引号就跟字符串一样,不是一个函数,而且你这是准备干吗?为什么会把调用的方法放在方法内部??没看太懂,不应该是定义一个函数,在其他地方进行调用吗?


查看完整回答
反对 回复 2019-05-13
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

你这问的,跟setTimeout这个方法没有关系,是JS参数语法的问题,你把变量用字符窜包起来系统不就认为你传进来的是字符窜吗,所以就没有达到你预期的效果,是你自己本身理解不够的问题


查看完整回答
反对 回复 2019-05-13
?
慕村225694

TA贡献1880条经验 获得超4个赞

加了单引号,就变成字符串了,定时器的第一个参数应该是个函数
(function a(){
document.write('1');
setTimeout(a,2000);
})();
自执行函数(function(){})()
一开始你先执行函数a所以页面显示1
然后定时器里你有回调了函数a啊,就构成了一个不断的循环。
页面显示的效果就是一开始有一个1,然后每延时2秒就多一个1.

查看完整回答
反对 回复 2019-05-13
?
富国沪深

TA贡献1790条经验 获得超9个赞

首先,你要的效果是每隔两秒往页面里输出一个1

那么你在settimeout里面的函数写法有问题,第一种写法,‘a()’这是一个字符串,虽然后来又被解析了,但是这时候已经是两秒以后了,这时候并不是说a是私域里的变量所以找不到之类的,而是因为你这里找的是'a' 而不是a 这两个是有本质上的区别的,一个是字符串,一个是变量。
第二,如果按照你的写法,把这里改正过来,写成setTimeout(a(),2000); 这样就更加不对了,这里估计你自己也明白,在这里a函数直接就被执行了,而不是等到两秒以后才执行,所以这样写直接就死循环了。所以这样写也是不行的
第三,改成第二种写法,这时候setTimeout里面的a代表的就是a函数,所以会每隔两秒钟调用一次,这是正确的

查看完整回答
反对 回复 2019-05-13
?
梵蒂冈之花

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

里面要用函数名吧,上面讲的都很好!!!


查看完整回答
反对 回复 2019-05-13
  • 10 回答
  • 0 关注
  • 651 浏览
慕课专栏
更多

添加回答

举报

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