JavaScript的作用域和块级作用域概念理解
2015-12-04 09:26
531 查看
作用域
作用域永远都是任何一门编程语言中的重中之重,因为它控制着变量与参数的可见性与生命周期。说到这里我们需要理解两个概念:块级作用域与函数作用域。
函数作用域
这个应该好理解,函数作用域就是说定义在函数中的参数和变量在函数外部是不可见的。大多数类C语言都拥有块级作用域,JS却没有。请看下文demo:
//C语言 #include <stdio.h> void main() { int i=2; i--; if(i) { int j=3; } printf("%d/n",j); }
运行这段代码,会出现“use an undefined variable:j”的错误。可以看到,C语言拥有块级作用域,因为j是在if的语句块中定义的,因此,它在块外是无法访问的。
块级作用域
任何一对花括号中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域。
正如我们举的C语言的例子,大多数类C语言都是有块级作用域的,那么在JavaScript又有什么不同呢?
我们一起看看这个JavaScript的demo:
functin test(){ for(var i=0;i<3;i++){ } alert(i); } test();
运行这段代码,弹出"3",可见,在块外,块中定义的变量i仍然是可以访问的。也就是说,JS并不支持块级作用域,它只支持函数作用域,而且在一个函数中的任何位置定义的变量在该函数中的任何地方都是可见的。
那么我们该如何使JS拥有块级作用域呢?是否还记得,在一个函数中定义的变量,当这个函数调用完后,变量会被销毁,我们是否可以用这个特性来模拟出JS的块级作用域呢?看下面这个demo:
function test(){ (function (){ for(var i=0;i<4;i++){ } })(); alert(i); } test();
这时候再次运行,会弹出"i"未定义的错误,哈哈,实现了吧~~~这里,我们把for语句块放到了一个闭包之中,然后调用这个函数,当函数调用完毕,变量i自动销毁,因此,我们在块外便无法访问了。
**JS的闭包特性is the most important feature((*^__^*) 大家懂的)。在JS中,为了防止命名冲突,我们应该尽量避免使用全局变量和全局函数。那么,该如何避免呢?不错,正如上文demo所示,我们可以把要定义的所有内容放入到一个**
(function (){ //内容 })();
之中,这时候,我们是不是相当于给它们的外层添加了一个函数作用域呢?该作用域之外的程序是无法访问它们的。
Happy hacking!
相关文章推荐
- 轻松学习JavaScript九:JavaScript对象和数组
- 轻松学习JavaScript八:JavaScript函数
- Javascript技术难点之apply,call与this之间的衔接
- JavaScript的作用域和块级作用域概念理解
- 轻松学习JavaScript七:JavaScript的流程控制语句
- 轻松学习JavaScript六:JavaScript的表达式与运算符
- 和JavaScript家的闭包玩玩捉迷藏
- 轻松学习JavaScript五:JavaScript的变量和数据类型
- 轻松学习JavaScript四:JS点击灯泡来点亮或熄灭这盏灯的网页特效映射出JS在HTML中作用
- 轻松学习JavaScript三:JavaScript与HTML的结合
- 轻松学习JavaScript二:JavaScript语言的基本语法要求
- XML DOM
- 轻松学习JavaScript一:为什么学习JavaScript
- 给before和after伪元素设置js效果的方法
- 轻松学习JavaScript九:JavaScript对象和数组
- js继承有5种实现方式
- 简单对比分析JavaScript中的apply,call与this的使用
- 详解JavaScript的Date对象(制作简易钟表)
- 浅析2种JavaScript继承方式
- js 控制浏览器窗口大小