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示例代码
Dec 17 Javascript
给js文件传参数(详解)
Jul 13 Javascript
Javascript核心读书有感之类型、值和变量
Feb 11 Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
Mar 03 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
Oct 12 Javascript
Base64(二进制)图片编码解析及在各种浏览器的兼容性处理
Feb 09 Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
Apr 17 jQuery
Mui使用jquery并且使用点击跳转新窗口的实例
Aug 19 jQuery
微信小程序实现banner图轮播效果
Jun 28 Javascript
JavaScript常用内置对象用法分析
Jul 09 Javascript
用js限制网页只在微信浏览器中打开(或者只能手机端访问)
Dec 24 Javascript
WebWorker 封装 JavaScript 沙箱详情
Nov 02 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
php使用curl抓取qq空间的访客信息示例
2014/02/28 PHP
PHP中STDCLASS用法实例分析
2016/11/11 PHP
PHP实现图片的等比缩放和Logo水印功能示例
2017/05/04 PHP
基于JQuery的cookie插件
2010/04/07 Javascript
JS中的substring和substr函数的区别说明
2013/05/07 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
2013/12/28 Javascript
jquery实现checkbox全选全不选的简单实例
2013/12/31 Javascript
jquery实现textarea输入框限制字数的方法
2015/01/15 Javascript
jQuery表单美化插件jqTransform使用详解
2015/04/12 Javascript
jQuery EasyUI中的日期控件DateBox修改方法
2016/11/09 Javascript
数组Array的排序sort方法
2017/02/17 Javascript
jquery replace方法去空格
2017/05/08 jQuery
js表单序列化判断空值的实例
2017/09/22 Javascript
vue 使用Jade模板写html,stylus写css的方法
2018/02/23 Javascript
mac上配置Android环境变量的方法
2018/07/08 Javascript
Node.js连接Sql Server 2008及数据层封装详解
2018/08/27 Javascript
Node使用Nodemailer发送邮件的方法实现
2020/02/24 Javascript
详解JavaScript类型判断的四种方法
2020/10/21 Javascript
[06:21]完美世界亚洲区首席发行官竺琦TI3采访
2013/08/26 DOTA
python从入门到精通(DAY 2)
2015/12/20 Python
对Python Pexpect 模块的使用说明详解
2019/02/14 Python
python使用flask与js进行前后台交互的例子
2019/07/19 Python
Python操作qml对象过程详解
2019/09/26 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
2019/12/31 Python
Python 使用 environs 库定义环境变量的方法
2020/02/25 Python
Pytorch 使用不同版本的cuda的方法步骤
2020/04/02 Python
calendar在python3时间中常用函数举例详解
2020/11/18 Python
HTML5自定义元素播放焦点图动画的实现
2019/09/25 HTML / CSS
什么是View State?
2013/01/27 面试题
中科软测试工程师面试题
2012/06/16 面试题
建龙钢铁面试总结
2014/04/15 面试题
大学生求职简历的自我评价
2013/10/21 职场文书
企业承诺书怎么写
2014/05/24 职场文书
计划生育目标责任书
2015/05/09 职场文书
太行山上观后感
2015/06/05 职场文书
2016入党积极分子党校培训心得体会
2016/01/06 职场文书