Javascript变量作用域详解


Posted in Javascript onDecember 06, 2013

变量的作用域指的是变量的可见性,而生命周期则(存活期)则是从另一个角度考察变量。

JS中变量的作用域分为全局变量和局部变量,函数内定义的称为局部变量,函数外的称为全局变量。(“函数外的称为全局变量”是相对的,另此处讨论的前提是用var显式声明的变量,函数内不用var定义的变量默认是全局变量,当然忽略var声明变量是不赞成的)。

var glob = 4;//函数外声明全局变量 
function fun() { 
    var height = 20; //函数内用var声明的是局部变量 
    weight = 50; //函数内不用var声明的是全局变量 
} 
fun(); 
alert(weight);

JS中没有块级作用域,即用大括号{}包含的。Java中则有。在main方法中写入下代码
public static void main(String... args) { 
for(int i=0;i<5;i++) { 

} 
    { 
        int j=10; 
    } 
    int z = 20; 
    System.out.println(i); // i不可见,语法分析时报错,即编译不通过 
    System.out.println(j); // j不可见,语法分析时报错,即编译不通过 
    System.out.println(z); // z可见,输出20 
}

但如果在JS中
for(var i=0;i<5;i++) { 
} 
var obj = {name:"Lily"}; 
for(var attr in obj) { 
} 
{ 
  var j=10; 
} 
alert(i);//输出4,没有块级作用域 
alert(attr); //输出name,没有块级作用域 
alert(j);//输出10,没有块级作用域

这也说明一个问题,避免在全局范围内使用for循环同时声明变量,否则会造成全局命名范围的污染。

当然,JS1.7中提出了let关键字声明变量(见https://developer.mozilla.org/cn/New_in_JavaScript_1.7),只作用于for语句范围。

for(let i=0;i<5;i++) { 
   //todo 
} 
alert(i);//运行时报错,提示i未定义

JS1.7需要这样引用 <script type="application/javascript;version=1.7"/></script>

ps:firefox2+实现了JS1.7

Javascript 相关文章推荐
Javascript下判断是否为闰年的Datetime包
Oct 26 Javascript
JavaScript Array Flatten 与递归使用介绍
Oct 30 Javascript
一个js控制的导航菜单实例代码
Dec 03 Javascript
js树插件zTree获取所有选中节点数据的方法
Jan 28 Javascript
深入理解JQuery循环绑定事件
Jun 02 Javascript
Bootstrap和Java分页实例第二篇
Dec 23 Javascript
javascript十六进制数字和ASCII字符之间的转换方法
Dec 27 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
Jan 04 Javascript
js中DOM事件绑定分析
Mar 18 Javascript
浅谈Angular HttpClient简单入门
May 04 Javascript
vue.js 解决v-model让select默认选中不生效的问题
Jul 28 Javascript
vue print.js打印支持Echarts图表操作
Nov 13 Javascript
JavaScript1.6数组新特性介绍以及JQuery的几个工具方法
Dec 06 #Javascript
Javascript中克隆一个数组的实现代码
Dec 06 #Javascript
浅析JavaScript中的同名标识符优先级
Dec 06 #Javascript
如何判断元素是否为HTMLElement元素
Dec 06 #Javascript
随鼠标上下滚动的jquery代码
Dec 05 #Javascript
js简单实现删除记录时的提示效果
Dec 05 #Javascript
Jquery 切换不同图片示例代码
Dec 05 #Javascript
You might like
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
php实现模拟登陆方正教务系统抓取课表
2015/05/19 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
2015/12/17 PHP
PHP如何实现跨域
2016/05/30 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
2016/10/13 PHP
php workerman定时任务的实现代码
2018/12/23 PHP
PHP实现浏览器格式化显示XML的方法示例
2019/01/22 PHP
javascript之dhDataGrid Ver2.0.0代码
2007/07/01 Javascript
Dojo 学习要点
2010/09/03 Javascript
jquery ajax return没有返回值的解决方法
2011/10/20 Javascript
JS操作select下拉框动态变动(创建/删除/获取)
2013/06/02 Javascript
jquery 日期控件datepicker属性详细解析
2013/11/08 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
jquery实现动态操作select选中
2015/02/11 Javascript
JavaScript获取两个数组交集的方法
2015/06/09 Javascript
Canvas + JavaScript 制作图片粒子效果
2017/02/08 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
2017/03/16 Javascript
js字符串与Unicode编码互相转换
2017/05/17 Javascript
微信小程序位置授权处理方法
2019/06/13 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
2019/11/01 Javascript
深入分析JavaScript 事件循环(Event Loop)
2020/06/19 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
2021/02/23 Vue.js
python dict remove数组删除(del,pop)
2013/03/24 Python
Python 字典与字符串的互转实例
2017/01/13 Python
Python实现 多进程导入CSV数据到 MySQL
2017/02/26 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
浅谈PySpark SQL 相关知识介绍
2019/06/14 Python
Python高阶函数、常用内置函数用法实例分析
2019/12/26 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
2020/08/04 Python
python删除文件、清空目录的实现方法
2020/09/23 Python
Python在线和离线安装第三方库的方法
2020/10/31 Python
J2EE面试题集锦(附答案)
2013/08/16 面试题
表演方阵解说词
2014/02/08 职场文书
公司劳动纪律管理制度
2015/08/04 职场文书
Redis缓存-序列化对象存储乱码问题的解决
2021/06/21 Redis