JavaScript的作用域和块级作用域概念理解


Posted in Javascript onSeptember 21, 2014

作用域永远都是任何一门编程语言中的重中之重,因为它控制着变量与参数的可见性与生命周期。讲到这里,首先理解两个概念:块级作用域与函数作用域。

什么是块级作用域呢?

任何一对花括号({和})中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域。

函数作用域就好理解了(*^__^*) ,定义在函数中的参数和变量在函数外部是不可见的。

大多数类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的语句块中定义的,因此,它在块外是无法访问的。

而JS是如何表现的呢,再看另一个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 (){ 
//内容 
})();

之中,这时候,我们是不是相当于给它们的外层添加了一个函数作用域呢?该作用域之外的程序是无法访问它们的。

Javascript 相关文章推荐
解析使用JS 清空File控件的路径值
Jul 08 Javascript
浮动的div自适应居中显示的js代码
Dec 23 Javascript
jquery实现可自动判断位置的弹出层效果代码
Oct 12 Javascript
JS实现带提示的星级评分效果完整实例
Oct 30 Javascript
在React框架中实现一些AngularJS中ng指令的例子
Mar 06 Javascript
微信小程序 教程之注册程序
Oct 17 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
Dec 09 Javascript
常用的 JS 排序算法 整理版
Apr 05 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
Jun 25 Javascript
JS实现从对象获取对象中单个键值的方法示例
Jun 05 Javascript
Node.js系列之安装配置与基本使用(1)
Aug 30 Javascript
node.js中stream流中可读流和可写流的实现与使用方法实例分析
Feb 13 Javascript
JavaScript中双叹号!!作用示例介绍
Sep 21 #Javascript
原生JavaScript实现合并多个数组示例
Sep 21 #Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
Sep 21 #Javascript
将数字转换成大写的人民币表达式的js函数
Sep 21 #Javascript
判断window.onload是否多次使用的方法
Sep 21 #Javascript
使用JavaScript进行进制转换将字符串转换为十进制
Sep 21 #Javascript
JS实现清除指定cookies的方法
Sep 20 #Javascript
You might like
无线电广播与收音机发展的历史回眸
2021/03/02 无线电
一个可以找出源代码中所有中文的工具
2006/10/25 PHP
PHP连接SQLServer2005 的问题解决方法
2010/07/19 PHP
php通过session防url攻击方法
2014/12/10 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
2016/01/05 PHP
Thinkphp5.0自动生成模块及目录的方法详解
2017/04/17 PHP
45个JavaScript编程注意事项、技巧大全
2015/02/11 Javascript
JS实现从表格中动态删除指定行的方法
2015/03/31 Javascript
深入php面向对象、模式与实践
2016/02/16 Javascript
关于在Servelet中如何获取当前时间的操作方法
2016/06/28 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
2016/12/02 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
2017/03/14 Javascript
详解Angular 中 ngOnInit 和 constructor 使用场景
2017/06/22 Javascript
Angular中的$watch、$watchGroup、$watchCollection
2017/06/25 Javascript
详解jQuery如何实现模糊搜索
2019/05/10 jQuery
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
Python线程创建和终止实例代码
2018/01/20 Python
用Eclipse写python程序
2018/02/10 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
Python处理session的方法整理
2019/08/29 Python
Python中使用gflags实例及原理解析
2019/12/13 Python
.dcm格式文件软件读取及python处理详解
2020/01/16 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
python中return如何写
2020/06/18 Python
详解tensorflow之过拟合问题实战
2020/11/01 Python
英国剑桥包官网:The Cambridge Satchel Company
2016/08/01 全球购物
会计专业个人求职信范文
2014/01/08 职场文书
幼儿园教师个人反思
2014/01/30 职场文书
房地产营销策划方案
2014/02/08 职场文书
班长演讲稿范文
2014/04/24 职场文书
班委竞选演讲稿
2014/04/28 职场文书
行政部经理助理岗位职责
2014/06/15 职场文书
学校感恩教育活动总结
2014/07/07 职场文书
2016年暑期见闻作文
2015/11/25 职场文书
大学生社区义工服务心得体会
2016/01/22 职场文书
Python中使用Lambda函数的5种用法
2021/04/01 Python