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 相关文章推荐
jquery必须知道的一些常用特效方法及使用示例(整理)
Jun 24 Javascript
jQuery实现table隔行换色和鼠标经过变色的两种方法
Jun 15 Javascript
jQuery实现自动滚动到页面顶端的方法
May 22 Javascript
以jQuery中$.Deferred对象为例讲解promise对象是如何处理异步问题
Nov 13 Javascript
jQuery EasyUI 页面加载等待及页面等待层
Feb 06 Javascript
jQuery的$.extend 浅拷贝与深拷贝
Mar 08 Javascript
vue.js select下拉框绑定和取值方法
Mar 03 Javascript
微信小程序调用摄像头隐藏式拍照功能
Aug 22 Javascript
当vue路由变化时,改变导航栏的样式方法
Aug 22 Javascript
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
Mar 27 Javascript
vue随机验证码组件的封装实现
Feb 19 Javascript
Node.js中的异步生成器与异步迭代详解
Jan 31 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
MySQL GBK→UTF-8编码转换
2007/05/24 PHP
深入PHP中的HashTable结构详解
2013/06/13 PHP
通过实例解析PHP数据类型转换方法
2020/07/11 PHP
Maps Javascript
2007/01/22 Javascript
jQuery对象和DOM对象相互转化
2009/04/24 Javascript
封装html的select标签的js操作实例
2013/07/02 Javascript
ie与ff下的event事件使用介绍
2013/11/25 Javascript
JavaScript中this详解
2015/09/01 Javascript
js省市联动效果完整实例代码
2015/12/09 Javascript
JQuery用户名校验的具体实现
2016/03/18 Javascript
jquery的ajax提交form表单的两种方法小结(推荐)
2016/05/25 Javascript
JavaScript中的this引用(推荐)
2016/08/05 Javascript
JS实现间歇滚动的运动效果实例
2016/12/22 Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
2017/09/28 Javascript
JS设计模式之访问者模式定义与用法分析
2018/02/05 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
Element Popover 弹出框的使用示例
2020/07/26 Javascript
[01:07]DOTA2次级职业联赛 - Fpb战队宣传片
2014/12/01 DOTA
Python删除指定目录下过期文件的2个脚本分享
2014/04/10 Python
Python压缩解压缩zip文件及破解zip文件密码的方法
2015/11/04 Python
举例讲解Python设计模式编程中的访问者与观察者模式
2016/01/26 Python
python中函数传参详解
2016/07/03 Python
Python 递归函数详解及实例
2016/12/27 Python
python编程嵌套函数实例代码
2018/02/11 Python
在pytorch中动态调整优化器的学习率方式
2020/06/24 Python
经验丰富程序员才知道的8种高级Python技巧
2020/07/27 Python
浅谈css3中calc在less编译时被计算的解决办法
2017/12/04 HTML / CSS
幼儿园中班开学寄语
2014/04/03 职场文书
社团活动总结
2014/04/28 职场文书
纪律教育月活动总结
2014/08/26 职场文书
民主评议政风行风整改方案
2014/09/17 职场文书
冰峪沟导游词
2015/02/09 职场文书
具结保证书范本
2015/05/11 职场文书
单位工作证明范本
2015/06/15 职场文书
MySQL 那些常见的错误设计规范,你都知道吗
2021/07/16 MySQL
聊聊redis-dump工具安装问题
2022/01/18 Redis