JavaScript中setTimeout和setInterval函数的传参及调用


Posted in Javascript onMarch 11, 2016

如何向 setTimeout 、 setInterval 传递参数
看如下代码:

var str = 'aaa'; 
var num = 2; 
function auto(num){ 
  alert(num); 
} 
setTimeout('auto(num)',4000);

这样写是可以正常工作的,但是如其说这是参数传递,还不如说是直接使用的全局变量。所以,这种写法是没有必要的,一般情况下更多的是用到传递局部变量作为参数。

把代码修改一下:

//var str = 'aaa'; 
var num = 2; 
function test(){ 
  var str = 'bbb'; 
  setTimeout('auto(str)',4000); 
} 
function auto(a){ 
  alert(a); 
} 
test();

这种写法会报错,如果把取消对 str 的全局声明的注释,就会输出 aaa,即函数依然是调用全局变量。
看下面的代码:

//var str = 'aaa'; 
var num = 2; 
function test(){ 
  var str = 'bbb'; 
  setTimeout('auto("str")',4000); 
} 
function auto(a){ 
  alert(a); 
} 
test();

注意上面的 str ,这样写会输出 “str”,也就是说定时器调用函数后,是把 str 直接当作了参数。这样传递的参数永远是字符串。这不是我们想要的结果。

要想传递除字符串意外的参数,可以使用闭包,看下面代码:

//var str = 'aaa'; 
var num = 2; 
function test(){ 
  var str = 'bbb'; 
  setTimeout(auto(str),4000); 
} 
function auto(str){ 
  return function(){ 
    alert(str); 
  } 
} 
test();

输出结果为 ‘bbb',如果给auto(str)加上引号同样会报错。
当然,这样写也是不错的:

var num = 2; 
function test(){ 
  var str = 'bbb'; 
  //setTimeout(auto(str),4000); 
  setTimeout(function(){alert(str)},4000); 
} 
function auto(str){ 
  return function(){ 
    alert(str); 
  } 
} 
test();

最后需要注意的是,字不使用闭包传递参数时,定时器调用的函数是要加引号的,不加引号,会报错。以上情形同样适合 setInterval();

setTimeout 、 setInterval 中的函数调用
有如下代码:

var num = 2; 
function auto(){ 
  alert(num); 
} 
setTimeout(auto(),4000);

在这段程序里,测试的时候立刻就可以看到弹出的警告框。也就是说按照以上方法引用函数,定时器是不起作用的。

同样,对于setInterval上面的写法也不能正常工作,程序只能弹出一次警告框,然后报错。
把定时器改为

setInterval('auto()',4000); 
setTimeout('auto()',4000);

程序可以正常工作。

当不使用auto()调用函数,只使用 auto会是什么样呢?

var str = 'aaa'; 
var num = 2; 
function auto(){ 
  alert(num); 
} 
//setInterval(auto,4000); 
setTimeout(auto,4000);

这样写程序都可以正常工作;

如果给auto加上引号

//setInterval('auto',4000); 
setTimeout('auto',4000);

都不能正常工作。

Javascript 相关文章推荐
取得传值的函数
Oct 27 Javascript
js取得url地址参数实例
Feb 22 Javascript
浅析jQuery EasyUI中的tree使用指南
Dec 18 Javascript
javascript单例模式的简单实现方法
Jul 25 Javascript
javascript字符串替换函数如何一次性全部替换掉
Oct 30 Javascript
详解webpack与SPA实践之开发环境搭建
Dec 18 Javascript
微信小程序实现文字无限轮播效果
Dec 28 Javascript
JavaScript的查询机制LHS和RHS解析
Aug 16 Javascript
es6中reduce的基本使用方法
Sep 10 Javascript
jQuery实现图片随机切换、抽奖功能(实例代码)
Oct 23 jQuery
vue实现图片上传功能
May 28 Javascript
vue实现购物车结算功能
Jun 18 Javascript
原生JavaScript制作微博发布面板效果
Mar 11 #Javascript
JavaScript获取图片像素颜色并转换为box-shadow显示
Mar 11 #Javascript
详解Angularjs中的依赖注入
Mar 11 #Javascript
详解AngularJS过滤器的使用
Mar 11 #Javascript
javascript html5 canvas实现可拖动省份的中国地图
Mar 11 #Javascript
js仿百度登录页实现拖动窗口效果
Mar 11 #Javascript
基于jQuery日历插件制作日历
Mar 11 #Javascript
You might like
PHP网上调查系统
2006/10/09 PHP
一篇有意思的技术文章php介绍篇
2010/10/26 PHP
PHP输入流php://input介绍
2012/09/18 PHP
PHP回溯法解决0-1背包问题实例分析
2015/03/23 PHP
Yii2第三方类库插件Imagine的安装和使用
2017/07/06 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
2018/08/17 PHP
JavaScript 10件让人费解的事情
2010/02/15 Javascript
javascript下4个跨浏览器必备的函数
2010/03/07 Javascript
编写高效jQuery代码的4个原则和5个技巧
2014/04/24 Javascript
NodeJS学习笔记之(Url,QueryString,Path)模块
2015/01/13 NodeJs
Jquery异步提交表单代码分享
2015/03/26 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
2016/07/28 Javascript
使用AngularJS2中的指令实现按钮的切换效果
2017/03/27 Javascript
AngularJS学习笔记之表单验证功能实例详解
2017/07/06 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
2017/10/20 Javascript
vue+element UI实现树形表格带复选框的示例代码
2019/04/16 Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
2019/04/17 Javascript
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
[38:21]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS Newbee
2018/03/31 DOTA
基于python的列表list和集合set操作
2019/11/24 Python
Django自定义全局403、404、500错误页面的示例代码
2020/03/08 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
2020/03/25 Python
几个CSS3的flex弹性盒模型布局的简单例子演示
2016/05/12 HTML / CSS
html5小技巧之通过document.head获取head元素
2014/06/04 HTML / CSS
德国baby-markt婴儿用品瑞士网站:baby-markt.ch
2017/06/09 全球购物
联想加拿大官方网站:Lenovo Canada
2018/04/05 全球购物
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
教师自我鉴定
2013/12/13 职场文书
写给保洁员表扬信
2014/01/08 职场文书
2014年健康教育实施方案
2014/02/17 职场文书
初中差生评语
2014/12/29 职场文书
会议开幕词
2015/01/28 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
mysql timestamp比较查询遇到的坑及解决
2021/11/27 MySQL