JavaScript 变量作用域分析


Posted in Javascript onJuly 04, 2011
/* 代码1 */ 
var scope = "global "; 
function checkScope() { 
var scope = "local "; 
function childCheck() { 
var scope = "childLocal "; 
document.write(scope); 
} 
function childUndefined() { 
document.write(scope); 
var scope; 
} 
function childOverride() { 
scope = "childOverride "; 
document.write(scope); 
} 
document.write(scope); //输出"local" 
childCheck(); //输出"childLocal" 
childUndefined(); //输出"undefined" 
childOverride(); //输出"childOverride" 
document.write(scope); //输出"childOverride" 
} 
checkScope(); //输出"local childLocal undefinedchildOverride childOverride" 
document.write(scope); //输出"global "

全局作用域与局部作用域
全局(global)变量的作用域是全局的,在Javascript中处处有定义;而函数内部声明的变量是局部(local)变量,其作用域是局部性的,只在函数体内部有定义。对于下面的输出读者应不会感到意外。
/* 代码2 */ 
var scope = "global"; 
function checkScope() { 
var scope = "local"; 
document.write(scope); 
} 
checkScope(); //输出"local" 
document.write(scope); //输出"global"

全局变量作用域中使用变量可以不用var语句,但在声明局部变量是一定要使用var语句,否则会视为对全局变量的引用。看下面代码:
/* 代码3 */ 
var scope = "global"; 
function checkScope() { 
scope = "local"; 
document.write(scope); 
} 
checkScope(); //输出"local" 
document.write(scope); //输出"local"

没有块作用域
Javascript没有块级作用域,函数中声明的变量在整个函数中都是有定义的。对于下面的代码对于生疏的读者可能颇感意外:
/* 代码4 */ 
var scope = "global"; 
function checkScope() { 
document.write(scope); //语句4.1 
var scope = "local"; //语句4.2 
document.write(scope); 
} 
checkScope(); //输出"undefinedlocal"

由于语句4.1(var scope = "local";)声明的变量在整个checkScope函数作用域内都有效,因此在语句4.2(document.write(scope); )执行的时scope引用的是局部变量,而此时局部变量scope尚未定义,所以输出”undefined”。因此一个好的编程习惯是将所有的变量声明集中起来放在函数的开头。

在了解了上述内容之后,读者再看看代码1应该不会感到困惑了。

对象的属性变量
对象的属性变量比较容易理解,看一下下面的代码读者应该不会感到疑惑。

/* 代码5 */ 
var scope = "global "; 
var obj = new Object(); 
obj.scope = "object "; 
obj.checkScope = function () { 
var scope = "loacl "; 
document.write(scope); //输出"loacl" 
document.write(this.scope); //输出"object" 
document.write(window.scope); //输出"global" 
} 
obj.checkScope(); //输出"loacl object global"
Javascript 相关文章推荐
多浏览器兼容性比较好的复制到剪贴板的js代码
Oct 09 Javascript
解决JS浮点数运算出现Bug的方法
Mar 12 Javascript
js获取某元素的class里面的css属性值代码
Jan 16 Javascript
JavaScript实现Base64编码转换
Apr 23 Javascript
Bootstrap网格系统详解
Apr 26 Javascript
关于JS变量和作用域详解
Jul 28 Javascript
详解js的六大数据类型
Dec 27 Javascript
EasyUI折叠表格层次显示detailview详解及实例
Dec 28 Javascript
flag和jq on 的绑定多个对象和方法(必看)
Feb 27 Javascript
React中ES5与ES6写法的区别总结
Apr 21 Javascript
Angular4 ElementRef的应用
Feb 26 Javascript
JavaScript设计模型Iterator实例解析
Jan 22 Javascript
JavaScript XML和string相互转化实现代码
Jul 04 #Javascript
JS对外部文件的加载及对IFRMAME的加载的实现,当加载完成后,指定指向方法(方法回调)
Jul 04 #Javascript
jQuery 对Select的操作备忘记录
Jul 04 #Javascript
javascript开发技术大全 第4章 直接量与字符集
Jul 03 #Javascript
javascript开发技术大全-第3章 js数据类型
Jul 03 #Javascript
javascript开发技术大全-第1章javascript概述
Jul 03 #Javascript
js 字符串转化成数字的代码
Jun 29 #Javascript
You might like
php中global和$GLOBALS[]的分析之一
2012/02/02 PHP
PHP生成短网址的3种方法代码实例
2014/07/08 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
php版微信js-sdk支付接口类用法示例
2016/10/12 PHP
php7 参数、整形及字符串处理机制修改实例分析
2020/05/25 PHP
js的with语句使用方法
2007/09/21 Javascript
javascript判断两个IP地址是否在同一个网段的实现思路
2013/12/13 Javascript
jquery实现页面常用的返回顶部效果
2016/03/04 Javascript
Bootstrap每天必学之标签页(Tab)插件
2020/08/09 Javascript
JavaScript中两个字符串的匹配
2016/06/08 Javascript
jQuery 移动端拖拽(模块化开发,触摸事件,webpack)
2016/10/28 Javascript
jQuery UI制作选项卡(tabs)
2016/12/13 Javascript
打造通用的匀速运动框架(实例讲解)
2017/10/17 Javascript
Node 升级到最新稳定版的方法分享
2018/05/17 Javascript
Python实现的中国剩余定理算法示例
2017/08/05 Python
python实现决策树分类算法
2017/12/21 Python
python3实现多线程聊天室
2018/12/12 Python
python turtle库画一个方格和圆实例
2019/06/27 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
2019/08/08 Python
Python爬虫 批量爬取下载抖音视频代码实例
2019/08/16 Python
flask 实现token机制的示例代码
2019/11/07 Python
PyCharm刷新项目(文件)目录的实现
2020/02/14 Python
python matlab库简单用法讲解
2020/12/31 Python
CSS3之transition实现下划线的示例代码
2018/05/30 HTML / CSS
js实现移动端H5页面手指滑动刻度尺功能
2017/11/16 HTML / CSS
欧洲最大的婴幼儿服装及内衣公司:Petit Bateau(小帆船)
2016/08/16 全球购物
elf彩妆英国官网:e.l.f. Cosmetics英国(美国平价彩妆品牌)
2017/11/02 全球购物
先进事迹报告会感言
2014/01/24 职场文书
创业者是否需要商业计划书?
2014/02/07 职场文书
体育口号大全
2014/06/18 职场文书
终止劳动合同协议书
2014/10/05 职场文书
北京天坛导游词
2015/02/12 职场文书
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android
选购到合适的激光打印机
2022/04/21 数码科技