变量作用域和定时器——Javascript 进阶知识整理

来源:互联网 发布:如何建立的电影数据库 编辑:程序博客网 时间:2024/05/20 02:53

变量作用域和定时器

  1. 变量提升
    JS的解释器在解释JS代码的时候会首先将代码都扫描一遍,将其中的变量和函数的声明提升到代码块的顶部,所以定义在代码后面的函数在前面代码就可以使用,变量也是如此,但是变量提升的仅仅是变量的声明语句,变量的赋值语句并没有提升,所以提前使用的话只会得到undefined的变量。
    此外,JS中规定循环和条件判断没有语句块,所以在循环和条件判断中声明的变量在此之外还可以继续使用,相当于变量声明在外部。
    以一段代码为例:
console.log(addNum());//这里可以得出,function的作用域是这段代码的范围console.log(str);//这里可以看出,str的声明也被提升了,但是赋值并没有被提升,所以结果是undefinedvar num;function addNum(){    num=0;    for(var i=5;i>0;i--){        num+=i;    }    console.log(i);//这里可以看出,i在for和if之外还可以使用,for和if并没有形成作用域,i的作用域是addNum内    return num;}var str="LI";
  1. 定时器
    javascript是单线程的语言,所有函数都运行在一个线程中,只有前一个函数运行完了有一个函数才能占用CUP执行,那么在这种情况下看似跑在其他县城上的定时器是如何工作的呢?
    定时器也是跑在javascript的线程上,也因为此,javascript的定时器并不能准确定时。
    如果当定时器时间到了,但是javascript当前却有函数正在运行,则定时器的回调函数会进行排队,直到当前函数执行完之后才会执行定时器的回调函数。
    细致一点说,定时器分为两种setTimeoutsetInterval,一个是定时一次,回调函数执行一次就完了,一个是周期性定时,回调函数会周期性执行。这两种定时器在排队的表现又有不同。
    setTimeout的定时器表现如上所述,而setInterval定时器的表现却有不同,想象一下,如果setInterval的回调函数在第n次执行的时候,第n-1次的回调函数还在排队中没有执行,第n次的回调函数还会进入排队吗?答案是不会,同一个setInterval定时器,javascript不允许队伍有多个同一个setInterval定时器的回调函数进行排队。
    此外,在使用时,setTimeout和setInterval还有一个不同之处,考虑如下代码:
setTimeout(function test(){    //dosomething    setTimeout(test,10);},10);setInterval(function test(){    //dosomething},10);

上述两种代码虽然都实现了周期性执行函数test的功能,但是setTimeout的执行间隔时间和setInterval并不同,setTimeout下一次test函数执行的时间是test内部所有代码执行完毕用时+10ms,而setInterval的执行间隔时间只有10ms,如果test函数的执行时间接近于或者大于10ms的话,setInterval的方法会使test连续执行,甚至引起test函数执行的排队。

0 0
原创粉丝点击