首先声明本人资质尚浅,如有错误,欢迎指正、共同提高。

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

首先声明:本文不重点讨论this作用域,而是讨论普通变量在定时器中容易报错的情况;

setTimeout的基本用法不再重述,

详见:http://www.w3school.com.cn/htmldom/met_win_settimeout.asp

bug:

  setTimeout的第一个参数有两种形式:

  1) 字符串code;  

  function test (){

    var a=1;

    setTimeout("a++",100);//a is not defined;

  }

  test();

  2) 函数形式;

  function test (){

    var a=1;

    setTimeout(function(){

      a++;

      console.log(a); //正常运行,却打印出结果2;

    },100);

  }

  test();

为什么第一种情况容易出错呢?

我们知道,setTimeout方法是挂在window对象下的。《JavaScript高级程序设计》第二版中,写到:“超时调用的代码都是在全局作用域中执行的,因此函数中this的值在非严格模式下指向window对象,在严格模式下是undefined”。在这里,我们只讨论非严格模式。

因而对于第一种形式(string code)的情况,定时器汇总调用的是全局变量a,而上下文中定义的变量是局部变量,所以会报错;

对于第二种形式(函数形式)可以这么理解:在这里匿名函数的使用形成了一个闭包,从而能访问到外层函数的局部变量。只是这种闭包,跟常见的闭包不同,因为函数式放在setTimeout里面。

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

如有错误,欢迎评论指正、共同提高。[握手]

欢迎转载,转载请注明:转载自[ http://www.cnblogs.com/juneling ]

js 定时器(setTimeout/setInterval)出现变量未定义(xxx is not defined) 的解决方法的更多相关文章

  1. js中setTimeout/setInterval定时器用法示例

    js中setTimeout(定时执行一次)和setInterval(间隔循环执行)用法介绍. setTimeout:在指定的毫秒数后调用指定的代码段或函数:setTimeout示例代码 functio ...

  2. js 温故而知新 用typeof 来判断一个未定义的变量

    一直以为,如果你使用一个未定义的变量,肯定会报错.甚至根本不可能有这种场景. 但仔细想想还是有的,譬如你要判断全局是否存在$变量.或者要为全局暴漏一个全局变量之前,先判断是否有这个变量. typeof ...

  3. 定时器(setTimeout/setInterval)调用带参函数失效解决方法

    也许你曾碰到过这样的问题,不管是setInterval()还是setTimeout(),当code参数里放一个带参函数时,定时器都会失效,看下面这个例子: function test(str){ al ...

  4. KEIL建立新唐MCU的工程时,移植官网程序报错变量未定义问题解决方法

    最近在使用新唐的MCU,新唐的MCU使用还算方便,你安装好KEIL之后再安装 Nu-Link_Keil_Driver_V3.00.6909 驱动即可建立新唐的MCU工程,注意的是因为新唐MCU是C51 ...

  5. JS 定时器 setTimeout 与 setInterval 的区别和用法

    定时器: window.setTimeout(function(){},间隔时间毫秒); -- 定时炸弹,延迟执行,只执行一次 window.setInterval(function(){},间隔的时 ...

  6. 清除定时器 和 vue 中遇到的定时器setTimeout & setInterval问题

    2019-03更新 找到了更简单的方法,以setinterval为例,各位自行参考 mounted() { const that = this const timer = setInterval(fu ...

  7. Juqery 定时器 settimeout setInterval

    setTimeout 只执行一次 setTimeout(loading_tree,2000); function loading_tree(){ $('body').mLoading("hi ...

  8. 【知识】定时器setTimeout/setInterval执行时this指针指向问题

    [问题描述] setTimetout/setInterval中this指针指向window,以下是一个小demo: var demoChange = { key: true, changeFun() ...

  9. [HTML]js定时器使用 setInterval

    setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭.由 s ...

  10. js跨域请求提示函数未定义的问题

    我的代码是这么写的 window.onload=function(){ function sendRequest(){ var script=document.getElementById(" ...

随机推荐

  1. PAT 甲级 1060 Are They Equal (25 分)(科学计数法,接连做了2天,考虑要全面,坑点多,真麻烦)

    1060 Are They Equal (25 分)   If a machine can save only 3 significant digits, the float numbers 1230 ...

  2. AES加密(java和C#)

    需求:Java和C#进行数据交互,互相采用AES/CBC/PKCS5Padding进行加解密 Java加密和解密的代码如下: /** * 加密 1.构造密钥生成器 2.根据 ecnodeRules 规 ...

  3. (七)Centos之链接命令

    一.链接命令:ln  (link) ln -s [源文件] [目标文件] 功能描述:生成链接文件 选项: -s 创建软链接 二.硬链接 硬链接特征: 1,拥有相同的i节点和存储block块,可以看作是 ...

  4. 第一个php文件运行

    运行会发现报错,解决参考:写的很详细 http://blog.csdn.net/meegomeego/article/details/36020553

  5. Linux下批量解压.Z格式文件

    下面的代码演示如何将当前目录下sj目录下的所有.Z格式文件解压到sj_result目录下. 代码示例: for file in `ls ./sj` do prefix=${file%.*} echo ...

  6. [CareerCup] 2. Bomberman 炸弹人

    We have a 2D grid. Each cell is either a wall, an enemy or empty. For example (0-empty, X-enemy, Y-w ...

  7. 推特Twitter视频下载的2种方法

    Twitter上面的小视频越来越受欢迎了,其实,从社会发展的角度看,短视频的流行是一种必然的趋势.首先,智能手机和高速网络的普及,让人们的碎片化时间得以利用.坐地铁.吃饭的时间,点开一个视频段子.学一 ...

  8. Ubuntu linux 下的基本操作

    防火墙相关: 关闭防火墙: ufw disable

  9. markdown转移字符表

    本片转的ASCII码,主要针对$,另外我为了不让"&#xxx;"被转移成字符,我在分号";"前加了个空格,复制的时候注意一下 字符 转义 0 空格 @ ...

  10. uwp,c#,全屏播放保持屏幕响应

    在开发视频app的时候,全屏播放一段时间内没有电脑操作,电脑会自动进入睡眠模式,这时就要多写些代码来保持响应了. (这里使用的是MediaElement播放控件,MediaElement需要手动添加代 ...