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 相关文章推荐
jquery无缝向上滚动实现代码
Mar 29 Javascript
用C/C++来实现 Node.js 的模块(二)
Sep 24 Javascript
在JavaScript中用getMinutes()方法返回指定的分时刻
Jun 10 Javascript
跟我学习javascript的call(),apply(),bind()与回调
Nov 16 Javascript
javascript中apply/call和bind的使用
Feb 15 Javascript
Bootstrap datepicker日期选择器插件使用详解
Jul 26 Javascript
Vue源码解析之Template转化为AST的实现方法
Dec 14 Javascript
vue-router启用history模式下的开发及非根目录部署方法
Dec 23 Javascript
nvm、nrm、npm 安装和使用详解(小结)
Jan 17 Javascript
JS+html5实现异步上传图片显示上传文件进度条功能示例
Nov 09 Javascript
京东优选小程序的实现代码示例
Feb 25 Javascript
Vue实现一种简单的无限循环滚动动画的示例
Jan 10 Vue.js
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
玩家交还《星际争霸》原始码光盘 暴雪报以厚礼
2017/05/05 星际争霸
mysql5写入和读出乱码解决
2006/11/25 PHP
理解PHP中的stdClass类
2014/04/18 PHP
CI框架常用方法小结
2016/05/17 PHP
php cookie工作原理与实例详解
2016/07/18 PHP
PHP 获取客户端 IP 地址的方法实例代码
2018/11/11 PHP
Laravel 登录后清空COOKIE的操作方法
2019/10/14 PHP
用JQuery 实现的自定义对话框
2007/03/24 Javascript
flash调用js中的方法,让js传递变量给flash的办法及思路
2013/08/07 Javascript
JScript中的条件注释详解
2015/04/24 Javascript
js实现div拖动动画运行轨迹效果代码分享
2015/08/27 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
2016/06/22 Javascript
chrome下判断点击input上标签还是其余标签的实现方法
2016/09/18 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
2017/01/21 Javascript
Node.js使用NodeMailer发送邮件实例代码
2017/03/06 Javascript
JS检测是否可以访问公网服务器功能代码
2017/06/19 Javascript
Angular异步变同步处理方法
2018/08/13 Javascript
VUE 组件转换为微信小程序组件的方法
2019/11/06 Javascript
vue的webcamjs集成方式
2020/11/16 Javascript
原生JS实现音乐播放器的示例代码
2021/02/25 Javascript
python去除所有html标签的方法
2015/05/05 Python
python实现二分查找算法
2017/09/21 Python
python的文件操作方法汇总
2017/11/10 Python
Django中的CBV和FBV示例介绍
2018/02/25 Python
python3 requests中使用ip代理池随机生成ip的实例
2018/05/07 Python
python re库的正则表达式入门学习教程
2019/03/08 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
pycharm快捷键汇总
2020/02/14 Python
Django多层嵌套ManyToMany字段ORM操作详解
2020/05/19 Python
python 实现压缩和解压缩的示例
2020/09/22 Python
Python非单向递归函数如何返回全部结果
2020/12/18 Python
Trip.com澳大利亚:在线旅行社
2019/12/01 全球购物
土木工程毕业生自荐信
2013/11/12 职场文书
函授自我鉴定范文
2014/02/06 职场文书
Python实现Matplotlib,Seaborn动态数据图
2022/05/06 Python
Golang Web 框架Iris安装部署
2022/08/14 Python