JS变量重复声明以及忽略var 声明的问题及其背后的原理
来源:互联网 发布:linux 安装服务 编辑:程序博客网 时间:2024/06/09 16:48
JS的容错率很高,一些其他语言常见的小错误JS都能大度得包容,比如给一个方法传入超出预计的参数、在声明变量之前使用该变量(变量的声明提升解决了这个问题)等等,这里我们就要解剖一下JS变量重复声明以及当我们忽略var使用 a=2来声明变量时a为全局变量的问题:
//第一段代码var a = 2;var a = 3;alert(a);//3//第二段代码<span style="font-size:18px;"></span><pre name="code" class="javascript">a = 2;alert(a);//2
这两段代码在JS的眼中是完全可行的,JS会默默忽略掉第二个var声明来将程序继续执行下去,而且后面声明的值会覆盖掉前面声明的值,而第二段代码JS会将忽略var的声明默认声明为全局变量。这些大家都应该很清楚,但是JS遇到重复声明时背后到底是怎样运行的呢?那就关系到了JS的幕后黑手:引擎以及他的左膀右臂:编译器以及作用域。
在JS代码运行过程中:
引擎负责整个代码的编译以及运行,编译器则负责词法分析、语法分析、代码生成等工作而作用域则如我们熟知的一样,负责维护所有的标识符(变量)。
当我们执行上面的代码时,我们可以简单的理解为新变量分配一块儿内存,命名为a,并赋值为2,但在运行的时候编译器与引擎还会进行两项额外的操作:判断变量是否已经声明:
1.首先编译器对代码进行分析拆解,从左至右遇见var a,则编译器会询问作用域是否已经存在叫a的变量了,如果不存在,则招呼作用域声明一个新的变量a,若已经存在,则忽略var 继续向下编译,这时a = 2被编译成可执行的代码供引擎使用。
2.引擎遇见a=2时同样会询问在当前的作用域下是否有变量a,若存在,则将a赋值为2(由于第一步编译器忽略了重复声明的var,且作用域中已经有a,所以重复声明会发生值得覆盖而并不会报错)。若不存在,则顺着作用域链向上查找,若最终找到了变量a则将其赋值2,若没有找到,则招呼作用域声明一个变量a并赋值为2(这就是为什么第二段代码可以正确执行且a变量为全局变量的原因,当然,在严格模式下JS会直接抛出异常:a is not defined)。
虽然JS很勤劳,可以帮我们解决一些小问题,但是作为程序员的我们最好按照代码规范来进行书写,于人于己都大有裨益,何乐而不为呢。
注:关于a = 2 a会被声明为全局变量其中涉及到LHS查询方式,如需了解请移步至本人另一篇文章:JS引擎之LHS RHS
- JS变量重复声明以及忽略var 声明的问题及其背后的原理
- JS变量重复声明忽略的原理
- JS声明变量背后的原理
- js中var的重复声明
- js变量声明以及作用域的问题
- JS中用var声明变量和不用的区别
- js变量的声明、类型、以及使用
- js中var的有或无--重复声明和以后的声明
- 不同域(全局,局部)var变量声明的问题
- JS的变量声明
- javascript变量声明有误var的区别
- C#变量声明中var的使用
- 使用delete删除var声明的变量
- javascript var声明变量与不声明的区别
- js中变量声明的问题
- Node.js 中 变量声明 带var 和不带var 的情况
- JS中VAR的用处(局部变量要用var来声明,全局变量不加var)
- js中var声明和不加var的区别
- Android Studio目录结构
- 使用匿名管道pipe例子
- 最基础的KMP模式串匹配
- NSPredicate多条件查询
- git打补丁(patch)
- JS变量重复声明以及忽略var 声明的问题及其背后的原理
- Codeforces Round Intel Code Challenge Final Round C. Ray Tracing
- Slidingmenu侧滑菜单
- Android图像格式类及图像转换方法
- Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) B
- 控件背景为四周虚线
- lamp之源码包安装apache
- [kuangbin带你飞]专题四 最短路练习 B POJ 2253
- 寻路算法 Astar A星算法