js setInterval详解

【自己总结】:

语法  setInterval(code,interval)

①可以有第三个参数,第三个参数作为第一个参数(函数)的参数

②第一个参数是函数,有三种形式:

  1、传函数名,不用加引号,也不加括号,如 setInterval( func, 1000)

  2、传匿名函数,实际和1是一样的

  3、传函数字符串,加引号,也要加括号。如 setInterval("func()",1000);   这种方法,会在全局作用域下查找函数,有时候有问题。所以推荐前两种

附两篇很详细的教程

第一篇        http://www.softwhy.com/forum.php?mod=viewthread&tid=3972

第二篇  http://www.softwhy.com/forum.php?mod=viewthread&tid=6940

第一篇

setInterval()方法的定义和用法:
此方法可以按照指定的周期执行来执行一段程序;周期是以毫秒为单位的。
window.setInterval()方法当然也可以简写成setInterval()。
特别说明:凡是属于window对象的方法都可以直接使用,无需使用window对象调用。
如果不关闭游览器或者调用clearInterval()将会永远的执行下去。
返回值是当前定时器的唯一ID标识。
语法结构:

[JavaScript] 纯文本查看 复制代码运行代码


1

setInterval(code,interval)

参数列表:

参数 列表
code 必需。要周期执行的程序。
interval 必需。周期的时间跨度,以毫秒计算。

浏览器支持:
(1).IE浏览器支持此方法。
(2).Firefox浏览器支持此方法。
(3).Opera浏览器支持此方法。
(4).chrome浏览器支持此方法。
(5).safria浏览器支持此方法。
代码实例:

[HTML] 纯文本查看 复制代码运行代码


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<meta name="author" content="http://www.softwhy.com/" />

<title>蚂蚁部落</title>

<script type="text/javascript">

window.onload = function () {

  var count = 0;

  var bt = document.getElementById("bt");

  function show(){

    document.getElementById("ant").innerHTML = count + 1;

    count =count +1;

  }

  var flag = setInterval(show, 1000);

  bt.onclick = function () {

    clearInterval(flag);

  }

}

</script>

</head>

<body>

<div id="ant">0</div>

<input type="button" id="bt" value="停止定时器"/>

</body>

</html>

上面的代码中,数字会进行累加操作;点击按钮之后能够停止定时器方法的执行。
传递三个参数:
大多数教程对于setInterval()方法的介绍可能到此为止,其实内容还有挺多的。
先来看一段代码实例:

[HTML] 纯文本查看 复制代码运行代码


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<meta name="author" content="http://www.softwhy.com/" />

<title>蚂蚁部落</title>

<script type="text/javascript">

window.onload = function () {

  var count = 0;

  var max = 20;

  var bt = document.getElementById("bt");

  function show(max) {

    if (count >= max) {

      clearInterval(flag);

      return;

    }

    document.getElementById("ant").innerHTML = count + 1;

    count = count + 1;

  }

  var flag = setInterval(show, 1000, max);

  bt.onclick = function () {

    clearInterval(flag);

  }

}

</script>

</head>

<body>

<div id="ant">0</div>

<input type="button" id="bt" value="停止定时器"/>

</body>

</html>

由上面的代码可以看出setInterval()方法可以接收三个参数,此参数会作为参数传递给第一个函数参数。
也就是说max会作为一个参数传递给函数show(),当count的值大于等于max时,会停止定时器的执行。
此语法结构是ES5新增,所有具有一定的浏览器兼容问题:
(1).IE9和IE9以上浏览器支持此语法格式。
(2).谷歌浏览器支持此语法格式。
(3).火狐浏览器支持此语法格式。
(4).opera浏览器支持此语法格式。
(5).safria浏览器支持此语法格式。
第一个参数类型:
在上面的代码中,第一个参数类型是函数对象(推荐方式),其实第一个参数也可以是一个字符串。
代码实例如下:

[HTML] 纯文本查看 复制代码运行代码


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<meta name="author" content="http://www.softwhy.com/" />

<title>蚂蚁部落</title>

<script type="text/javascript">

var flag = null;

var count = 0;

var max = 20;

function show(max) {

  if (count >= max) {

    clearInterval(flag);

    return;

  }

  document.getElementById("ant").innerHTML = count + 1;

  count = count + 1;

}

window.onload = function () {

  var bt = document.getElementById("bt");

  flag=setInterval("show()", 1000, max);

  bt.onclick = function () {

    clearInterval(flag);

  }

}

</script>

</head>

<body>

<div id="ant">0</div>

<input type="button" id="bt" value="停止定时器"/>

</body>

</html>

上面的代码setInterval()方法的第一个参数是一个字符串,这种处理方式类似于eval()方法。
但是要特别注意一下作用域问题,如果第一个参数是字符串,那么会在全区作用域查找show()函数。

[HTML] 纯文本查看 复制代码运行代码


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<meta name="author" content="http://www.softwhy.com/" />

<title>蚂蚁部落</title>

<script type="text/javascript">

var flag = null;

var count = 0;

var max = 20;

window.onload = function () {

  var bt = document.getElementById("bt");

  function show(max) {

    if (count >= max) {

      clearInterval(flag);

      return;

    }

    document.getElementById("ant").innerHTML = count + 1;

    count = count + 1;

  }

  flag=setInterval("show()", 1000, max);

  bt.onclick = function () {

    clearInterval(flag);

  }

}

</script>

</head>

<body>

<div id="ant">0</div>

<input type="button" id="bt" value="停止定时器"/>

</body>

</html>

我们把show()方法定义在window.onload事件处理函数之内,那么就报错了。

第二篇

可以事先参阅setInterval()用法一章节。

学过JavaScript 脚本语言的都应该接触过setInterval 函数.如何使用我想大家都知道,但是有时候还是会在使用的时候碰到这样或那样的问题。下面的问题也是在QQ群经常碰到有人问的最多的,问题如下图:

<ignore_js_op>

首先声明:本人技术水平很低,以下所诉完全是依照自己的理解来做一些说明。如果有不当之处,还请批评斧正!以下仅仅是对自己理解,就当完事扯蛋吧!其内容都非常浅显,聊的多了自己也搞不定了!因为真的怕扯蛋扯疼了!

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

其实提上对函数的调用均能执行。首先我们看以下代码

[HTML] 纯文本查看 复制代码运行代码


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

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

[JavaScript] 纯文本查看 复制代码运行代码


1

setInterval("fun()",1000);

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

[JavaScript] 纯文本查看 复制代码运行代码


1

setInterval(fun(),1000);

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

[JavaScript] 纯文本查看 复制代码运行代码


1

2

3

4

5

6

      function funone() {

          return function () {

            alert("qishiwoyenengzhixing")

          }

      }

setInterval(funone(), 1000);//你敢说我不能执行?

我个人认为这种设计或者调用完全没有任何意义,用其他的方法就行了。
--------------------------------------------------------------------------------------------------------------

[JavaScript] 纯文本查看 复制代码运行代码


1

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

大家可以把这种调用setInterval的第一个参数看作参数为 函数名或函数的引用。当然我们还可以这样调用,使用匿名函数。

[JavaScript] 纯文本查看 复制代码运行代码


1

2

3

4

setInterval(function () {

            alert("我一秒中执行一次");

        }, 1000)

---------------------------------------------------------------------------------------------------------------

有些人可能发现,在全局作用域下  setInterval("fun()",1000); 可以正常执行,但放到window.onload函数中却不能执行。为什么呢?
先请看代码:

[JavaScript] 纯文本查看 复制代码运行代码


1

2

3

4

5

6

7

8

9

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)  的调用是以可执行代码 执行。给出以下代码共大家测试:

[JavaScript] 纯文本查看 复制代码运行代码


1

2

3

4

function fun() {

            alert(1);

        }

        setInterval("alert(fun)",2000);

[JavaScript] 纯文本查看 复制代码运行代码


1

setInterval("var a=1;var b=2;c=a+b;alert(c);",1000); //大家说这个会是什么呢 ?

 

时间: 2024-12-28 10:16:05

js setInterval详解的相关文章

开胃小菜——impress.js代码详解

README 友情提醒,下面有大量代码,由于网页上代码显示都是同一个颜色,所以推荐大家复制到自己的代码编辑器中看. 今天闲来无事,研究了一番impress.js的源码.由于之前研究过jQuery,看impress.js并没有遇到太大的阻碍,读代码用了一个小时,写这篇文章用了近三个小时,果然写文章比读代码费劲多了. 个人感觉impress.js的代码量(算上注释一共不到1000行)和难度(没有jQuery的各种black magic= =)都非常适合新手学习,所以写一个总结,帮助大家理解源码. 考

Bootstrap transition.js 插件详解

Bootstrap transition.js 插件详解 时间 2015-01-27 12:12:00 博客园-原创精华区 原文  http://www.cnblogs.com/xyzhanjiang/p/4252513.html 主题 Bootstrap JavaScript Bootstrap 自带的 JavaScript 插件的动画效果几乎都是使用 CSS 过渡实现的,而其中的 transition.js 就是为了判断当前使用的浏览器是否支持 CSS 过渡.下面先来简单了解下 CSS 过渡

Node.js npm 详解

Node.js npm 详解 一.npm简介 安装npm请阅读前辈的文章,很详细的介绍. npm的全称:Node Package Manager. (1)通俗的理解 其实从字面意思就可以理解这个产品有什么作用翻译为"Node包管理器".对,就是Node的包的一个管理工具,目前我尝试的有 下载并安装包(npm install [pkg]) 升级安装包(npm update [pkg]) 卸载安装包(npm uninstall/rm [pkg]),可以指定卸载包的版本号 - 其实这些命令很

require(&#39;./expample.js).default详解

最近总碰到类似于 var a = require('./expample.js).default 这样的代码,感觉很奇葩,总结一波. 为什么会出现这个问题? import 是静态编译的,而 require 可以动态加载,也就是说你可以通过判断条件来决定什么时候去 require ,而 import 则不行,所以有时候我们会面临需要通过require 去导入一个es6模块(比如react-hot-loader官方demo :P) 当然,这只是场景之一. 前置知识 ES6 Module常用语法.譬如

第三天:JS事件详解-事件流

学习来源: F:\新建文件夹 (2)\HTML5开发\HTML5开发\04.JavaScript基础\6.JavaScript事件详解 学习内容:  1)基础概念 2)举例说明: 代码如上,如果用事件冒泡的方式来解释,先点击到接受时间的按钮,然后是div,因为按钮包含在div中,然后是html5然后到文档 事件的捕获,首先是文档接收, 然后是html 然后是div 最后是最具体的元素button来接收 学后感: 只是记住了它的意思,但是并没有明白有什么实际意义

JS正则表达式详解 转

开篇,还是得说说 ^    和    $    他们是分别用来匹配字符串的开始和结束,以下分别举例说明 "^The": 开头一定要有"The"字符串; "of despair$":    结尾一定要有"of despair" 的字符串; 那么, "^abc$": 就是要求以abc开头和以abc结尾的字符串,实际上是只有abc匹配 "notice": 匹配包含notice的字符串 你可以看

js对象详解

为什么要有对象 function printPerson(name, age, sex....) {}// 函数的参数如果特别多的话,可以使用对象简化function printPerson(person) {  console.log(person.name);  ……} 什么是对象 现实生活中:万物皆对象,对象是一个具体的事物,一个具体的事物就会有行为和特征.举例: 一部车,一个手机车是一类事物,门口停的那辆车才是对象 特征:红色.四个轮子 行为:驾驶.刹车 JavaScript中的对象 J

Javascript异步编程之setTimeout与setInterval详解分析(一)

Javascript异步编程之setTimeout与setInterval 在谈到异步编程时,本人最主要会从以下三个方面来总结异步编程( 注意: 特别解释:是总结,本人也是菜鸟,所以总结不好的,请各位大牛多多原谅!) 1. setTimeout与setInterval详细分析基本原理. 接下来这篇博客会总结setTimeout和setInterval基本点,对于上面三点会分三篇博客分别来总结,对于知道上面三点的人,但是又不是非常了解全面知识点的码农来说,没有关系的,我们可以慢慢来学习,来理解,或

Javascript异步编程之setTimeout与setInterval详解

http://www.cnblogs.com/tugenhua0707/ 在谈到异步编程时,本人最主要会从以下三个方面来总结异步编程( 注意: 特别解释:是总结,本人也是菜鸟,所以总结不好的,请各位大牛多多原谅!) 1. setTimeout与setInterval详细分析基本原理. 接下来这篇博客会总结setTimeout和setInterval基本点,对于上面三点会分三篇博客分别来总结,对于知道上面三点的人,但是又不是非常了解全面知识点的码农来说,没有关系的,我们可以慢慢来学习,来理解,或者