setInterval第一个参数加引号与不加引号区别

在JavaScript中的setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用做 clearInterval() 方法的参数来将其中止。javascript

  <!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 第一个参数 能够是函数名、匿名函数、函数的引用以及其余可执行代码。html

setInterval("fun()",1000);

其中这种加引号的调用就能够理解为 可执行代码  就行eval 同样去执行第一个参数,就是对fun方法的调用 理所固然的弹出 1  一秒钟间隔,一直执行.java

setInterval(fun(),1000);

而这个调用我就不理解使用者经过这种方式使用setInterval 的意图为什么.
fun() 是对函数的直接调用,也就是说当setInterval尚未开始函数func就执行了。若是这个函数没有返回值或者返回值不是可执行的函数或者其余的代码的话,就以上代码而言只是弹出1,以后就遍报错了.
难道这样的调用真的不能够吗?实际上是能够的!例如代码:函数

      function funone() {
          return function () {
            alert("qishiwoyenengzhixing")
          }
      }
setInterval(funone(), 1000);//你敢说我不能执行?

我我的认为这种设计或者调用彻底没有任何意义,用其余的方法就好了。测试

setInterval(fun,1000); //这种方法是正确的。

你们能够把这种调用setInterval的第一个参数看做参数为 函数名或函数的引用。固然咱们还能够这样调用,使用匿名函数。spa

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)执行后 会报错的,其调用错误。在以前已经讲过了,这里就不啰嗦了!code

------------------------------------------------------------------------------------------------
为了让你们明白 setInterval("fun()",1000)  的调用是以可执行代码 执行。给出如下代码共你们测试:xml

    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); //你们说这个会是什么呢 ?
相关文章
相关标签/搜索