变量作用域和定时器——Javascript 进阶知识整理
来源:互联网 发布:如何建立的电影数据库 编辑:程序博客网 时间:2024/05/20 02:53
变量作用域和定时器
- 变量提升
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";
- 定时器
javascript是单线程的语言,所有函数都运行在一个线程中,只有前一个函数运行完了有一个函数才能占用CUP执行,那么在这种情况下看似跑在其他县城上的定时器是如何工作的呢?
定时器也是跑在javascript的线程上,也因为此,javascript的定时器并不能准确定时。
如果当定时器时间到了,但是javascript当前却有函数正在运行,则定时器的回调函数会进行排队,直到当前函数执行完之后才会执行定时器的回调函数。
细致一点说,定时器分为两种setTimeout
和setInterval
,一个是定时一次,回调函数执行一次就完了,一个是周期性定时,回调函数会周期性执行。这两种定时器在排队的表现又有不同。
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
- 变量作用域和定时器——Javascript 进阶知识整理
- 【javascript知识进阶】变量声明和提升规则和自定义作用域
- 闭包——Javascript 进阶知识整理
- 函数拾遗——Javascript 进阶知识整理
- JavaScript 进阶(二)变量作用域
- 【知识整理】javascript基础语法总结(1)——变量和数据类型
- JavaScript基础2——变量、作用域和内存
- JavaScript基础——变量、作用域和内存问题
- javascript学习——块作用域和私有变量
- JavaScript基础——变量、作用域和内存问题
- 《javascript高级程序设计》——变量和作用域
- JavaScript变量和作用域
- JavaScript笔记整理——驯服线程和定时器
- JavaScript中的变量和变量作用域
- JavaScript变量作用域和变量提升
- 前端进阶——作用域的相关知识
- JavaScript笔记整理 —— 作用域
- 黑马程序员——ios知识整理——关于继承、实例变量作用域、私有方法
- HDU 1848 Fibonacci again and again(博弈sg函数)
- 419. Battleships in a Board
- BroadcastReceiver 基本介绍
- 关于request和session的生命周期
- JSONObject, JSONArray来构建json文本
- 变量作用域和定时器——Javascript 进阶知识整理
- J2EE之DAO设计模式及简单实现
- sg函数模版
- top命令详解
- React native添加iOS远程通知点击通知打开APP在APP杀死状态下闪退解决办法
- Java(2):Java SE疯狂复习第2篇(多态)
- P1164 小A点菜(背包方案数模板)
- P1049装箱问题(背包,变形)
- Android内存泄漏检测与MAT使用