setInterval函数第一个参数引号问题
来源:互联网 发布:生命密码金字塔图算法 编辑:程序博客网 时间:2024/05/16 15:14
在JavaScript中的setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数来将其停止。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head> <title></title> <script type="text/javascript"> function fun() { alert(1); } setInterval("fun()",1000);//全局作用域下正常执行 setInterval(fun(),1000); //调用函数正常,setInterval调用出错 setInterval(fun,1000); //正确 </script></head><body> </body></html>
以上代码来说都会弹出结果1.
当然以上代码其执行环境为全局。setInterval 第一个参数 可以是函数名、匿名函数、函数的引用以及其他可执行代码。
setInterval("fun()",1000);
其中这种加引号的调用就可以理解为 可执行代码 就行eval 一样去执行第一个参数,就是对fun方法的调用 理所当然的弹出 1 一秒钟间隔,一直执行.
setInterval(fun(),1000);
而这个调用我就不理解使用者通过这种方式使用setInterval 的意图为何.
fun() 是对函数的直接调用,也就是说当setInterval还没有开始函数func就执行了。如果这个函数没有返回值或者返回值不是可执行的函数或者其他的代码的话,就以上代码而言只是弹出1,之后就遍报错了.
难道这样的调用真的不可以吗?其实是可以的!例如代码:
function funone() { return function () { alert("qishiwoyenengzhixing") } }setInterval(funone(), 1000);//你敢说我不能执行?
我个人认为这种设计或者调用完全没有任何意义,用其他的方法就行了。
setInterval(fun,1000); //这种方法是正确的。
大家可以把这种调用setInterval的第一个参数看作参数为 函数名或函数的引用。当然我们还可以这样调用,使用匿名函数。
setInterval(function () { alert("我一秒中执行一次"); }, 1000)
有些人可能发现,在全局作用域下 setInterval("fun()",1000); 可以正常执行,但放到window.onload函数中却不能执行。为什么呢?
先请看代码:
window.onload = function () { function fun() { alert(1); } setInterval("fun()",1000);//这个报错了 未定义 重点在这一个 // setInterval(fun(), 3000); //这个和刚才全局的表现一样 // setInterval(fun,1000);//这个没有问题 }
setInterval("fun()",1000); 这种调用报未定义,在全局我们已经说过了 。我们可以把带引号的参数理解为 可执行代码 。
而setInterval现在把以引号包括的可执行代码进行处理。就像eval一样给予执行。其在执行中 fun() 执行环境发生了变化,不是在window.onload方法下,而是在全局环境中也就是window.大家应该知道JavaScript存在作用域链,由内向外依次查找。内部可以访问其上层的函数和变量,而外部却不能访问内部的函数和变量。JavaScript有一个预编译处理,首先对函数和变量进行预编译。也就是说其函数和变量作用域是在其声明的时候确定的,而不是在执行的时候确定。当setInterval把"fun()"执行环境换为全局的后,对fun的调用是无效的。因为全局不能访问局部的函数和变量。window.onload相对于window来说就是局部的。
对与setInterval(fun(), 3000)和setInterval(fun,1000)调用其执行环境并没有改变,所以是可以访问的到的。只不过setInterval(fun(), 3000)执行后 会报错的,其调用错误。在之前已经讲过了,这里就不啰嗦了!
------------------------------------------------------------------------------------------------
为了让大家明白 setInterval("fun()",1000) 的调用是以可执行代码 执行。给出以下代码共大家测试:
var a =10; var b = 20; var c = a+b;window.onload = function(){ var a =1; var b = 2; var c = a+b; setInterval("alert(c);",1000); //30}
function fun() { alert(1); } setInterval("alert(fun)",2000);
setInterval("var a=1;var b=2;c=a+b;alert(c);",1000); //大家说这个会是什么呢 ?
- setInterval函数第一个参数引号问题
- JavaScript中setInterval函数应用常见问题之一(第一个参数不加引号与加引号的区别)
- setInterval第一个参数加引号与不加引号区别
- javascript中setInterval和setTimeout第一个参数加与不加引号的区别
- setInterval() 第一个参数的用法
- js函数调用时候参数的引号问题
- js拼接字符串函数名称中带参数引号问题
- js函数调用时候参数的引号问题
- js拼接字符串函数名称中带参数引号问题
- setInterval的函数有多个参数导致的失效问题
- setTimeout/setInterval 第三个参数
- setInterval函数线程问题
- 关于SetInterval(code,time)的第一个参数的几种用法详解
- 多个setInterval 冲突问题
- AfxRegisterWndClass(0,....)第一个参数的问题
- setTimeout的第一个参数出错问题
- Objective-c的第一个问题:中缀符,到底什么是函数名,什么是参数?
- js函数参数传递,引号的问题,第二次犯错,记下来,以后不能犯了!
- spring中的定时器 Quartz
- Mac El Capitan(10.11.6) 编译以及烧制Nexus6P(6.0.1-MTC20F)的曲折经历
- jquery为DOM元素缓存数据
- 邮票问题
- 怎样解决XMind 6中缺失安装java环境问题
- setInterval函数第一个参数引号问题
- ECharts系列 - 柱状图(条形图)实例一
- 【windows内核驱动开发】文件系统微过滤驱动Minifilter——获取进程信息
- 算法四 二分查找 java,c,c++
- mysqldump参数详细说明
- ubuntu14,64bit 下的arm-linux-gcc 的安装
- JS JavaScript获取Url参数,src属性参数
- PDOStatement对象的使用
- bootstrap validator表单提交初体验 基于HTML