一个困扰我很久的js问题,问题是这样的:function aa(){alert("aa")\x05}\x05setInterval("aa()",5000)/*这是一个间的测试函数,可以正常运行,但是我把它放到另一个函数中就不能运行 了*/function test(){function a

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/02 21:13:56
一个困扰我很久的js问题,问题是这样的:function aa(){alert(

一个困扰我很久的js问题,问题是这样的:function aa(){alert("aa")\x05}\x05setInterval("aa()",5000)/*这是一个间的测试函数,可以正常运行,但是我把它放到另一个函数中就不能运行 了*/function test(){function a
一个困扰我很久的js问题,
问题是这样的:
function aa(){
alert("aa")
\x05}
\x05setInterval("aa()",5000)/*这是一个间的测试函数,可以正常运行,但是我把它放到另一个函数中就不能运行 了*/
function test(){
function aa(){
alert("aa")
}
setInterval("aa()",5000)
\x05
}
test() //为什么这样就不能运行了?按理说下面的可以运行,这个应该也可以运行啊
function test(){
function aa(){
alert("aa")
}
setInterval(aa,5000)
}
test() //这样又可以正常运行了

一个困扰我很久的js问题,问题是这样的:function aa(){alert("aa")\x05}\x05setInterval("aa()",5000)/*这是一个间的测试函数,可以正常运行,但是我把它放到另一个函数中就不能运行 了*/function test(){function a
这个要从setInterval函数的工作原理说起,相信你知道setInterval是有两个必须参数的,一个是代码,一个是时间间隔.
但是js有个重要的特性就是参数类型的灵活性,所以其实这里的setInterval的第一个参数‘代码’可以是两种,一个就是一个Function对象,就是上面的setInterval(aa,5000);另外一种就是代码串,以字符串表现,就是上面的setInterval("aa()",5000).
显然问题出现在第二种情形,问题的关键在于第二种情形的时候setInterval的执行机制:既然第二种情况传进去的代码是字符串,显然需要一种机制将其转化为js代码,而js中将字符串转为代码的方式有两种一个是eval函数,一个是Function类,setInterval使用的是Function类来执行相关的代码,那么setInterval("aa()",5000)就相当于var f = new Function("aa()");setInterval(f);但是这里Function类生成js代码的作用于都是全局的,在浏览器来讲就是window对象,而在window对象下面并没有aa这个函数(aa是test函数局部域的局部变量),所以出现错误.