javascript中的作用域与作用域链
前几天,在写一段js代码时,出现了一些问题,调了很长时间也没有调通,其原因是,我在处理变量的作用域时错误地沿用了C++的作用域机制。因此我回炉了一次。
如果你使用过C++或java等一系列的面向对象的编程语言,那么我相信一定对“作用域”这个概念并不陌生。它很好地体现了封装性,使得外面的环境不能轻易的访问到内部私有的变量或方法。我们也不必在变量命名上费神了。当然,在javascript中也有这种福利。不过,它和C++、java中的不太一样。
在javascript中作用域是通过函数来划分的,即函数外面不能直接访问函数内部的变量(这一点与c++相同),但是请注意,在javascript中是没有代码块这个概念的,例如:
a1;
var a2;
function f1(){
b1; for(var i = 0;i < 5;i++){
}
var b2 = i;
function f2(){
c1;
var c2 = i;
}
for(var i = 2;i < 7;i++){
} }
其中,a1、b1、c1之前都没有用 var声明,即全局变量,在任何地方都能访问到,除非在内部有同名的局部变量,就会被暂时覆盖。另外,在for中定义的var i是可以在for的外面访问的,javascript中没有代码块,即for并不能算一次封装,函数才是封装的单元。用var声明的变量时局部变量,受作用域限制。
对于作用域链的概念,即当我们使用一个变量时,要现在当前的环境中找,找不到,就再向上一级环境找,因此,作用域链就是一个栈,它用来保存,环境的包含关系。以上面的例子:函数f1()、f2()的关系:f1包含f2.如果程序执行到f2中,我们使用c2和b2,就要经历以下过程:先在作用域链在找到最顶端的环境,在里面找名字是c2和b2的变量,找到c2,即不再继续找(即使外面还有叫c2的变量),但是当前环境中没有名叫b2的局部变量。就再在作用域链上找上一级环境。如此重复,直到找到,如果到了最外层环境(全局),就看,有没有名为b2的全局变量。要是还没有,就将b2定义为全局环境下的全局变量,即相当于没用var声明(同a1、b1、c1)。
最新文章
- spring boot 添加拦截器
- 前端ps常用的小技巧
- Servlet和JSP学习指导与实践(三):JSP助阵
- 【原创】pads2007 Layout 电气连接性检查过孔显示错误
- java_设计模式_迭代器模式_Iterator Pattern(2016-08-12)
- wdcp/wdlinux一键包的php5.3版本添加Zend.so 和Soap.so
- 04747_Java语言程序设计(一)_第8章_多线程
- OpenGL ES 正反面设置指令
- .NET CORE——Console中使用依赖注入
- 并查集模板题(The Suspects )HZNU寒假集训
- 修改xml成正方形,保存
- python迭代器的说明
- 如何插入谷歌地图并获取javascript api 秘钥--Google Maps API error: MissingKeyMapError
- .NET MVC 控制器和行为
- Codeforces Edu Round 63(Rated for Div. 2)
- 记录一次 @Autowired 无法注入( spring依赖正常 idea显示有spring已注入的图标)导致空指针异常的原因
- BZOJ 3876 支线剧情 | 有下界费用流
- C++ VS2013环境编译使用sqlite数据库全过程
- Python Django 前后端数据交互 之 HTTP协议下GET与POST的区别
- Vim代码缩进设置