前几天,在写一段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)。

最新文章

  1. spring boot 添加拦截器
  2. 前端ps常用的小技巧
  3. Servlet和JSP学习指导与实践(三):JSP助阵
  4. 【原创】pads2007 Layout 电气连接性检查过孔显示错误
  5. java_设计模式_迭代器模式_Iterator Pattern(2016-08-12)
  6. wdcp/wdlinux一键包的php5.3版本添加Zend.so 和Soap.so
  7. 04747_Java语言程序设计(一)_第8章_多线程
  8. OpenGL ES 正反面设置指令
  9. .NET CORE——Console中使用依赖注入
  10. 并查集模板题(The Suspects )HZNU寒假集训
  11. 修改xml成正方形,保存
  12. python迭代器的说明
  13. 如何插入谷歌地图并获取javascript api 秘钥--Google Maps API error: MissingKeyMapError
  14. .NET MVC 控制器和行为
  15. Codeforces Edu Round 63(Rated for Div. 2)
  16. 记录一次 @Autowired 无法注入( spring依赖正常 idea显示有spring已注入的图标)导致空指针异常的原因
  17. BZOJ 3876 支线剧情 | 有下界费用流
  18. C++ VS2013环境编译使用sqlite数据库全过程
  19. Python Django 前后端数据交互 之 HTTP协议下GET与POST的区别
  20. Vim代码缩进设置

热门文章

  1. .NET接收邮件下载邮件附件——openpop.net
  2. hibernate打印sql日志及参数
  3. javascript获取浏览器高度与宽度信息
  4. genymotion安装及使用出现的问题
  5. js超链接
  6. Android学习记录帖
  7. IsBackground对线程的重要作用
  8. 处理http请求时,如何处理url的参数
  9. gulp 无损压缩图片
  10. Bootstrap学习笔记(四)