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 相关文章推荐
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
Sep 19 Javascript
对frameset、frame、iframe的js操作示例代码
Aug 16 Javascript
Ajax同步与异步传输的示例代码
Nov 21 Javascript
js单例模式详解实例
Nov 21 Javascript
JQuery 图片滚动轮播示例代码
Mar 24 Javascript
JS实现点击按钮后框架内载入不同网页的方法
May 05 Javascript
第七章之菜单按钮图标组件
Apr 25 Javascript
javascript实现起伏的水波背景效果
May 16 Javascript
jQuery Validate 校验多个相同name的方法
May 18 jQuery
浅谈vue-router 路由传参的方法
Dec 27 Javascript
vue-cli构建项目下使用微信分享功能
May 28 Javascript
详解微信小程序实现仿微信聊天界面(各种细节处理)
Feb 17 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调用数据库的存贮过程!
2006/10/09 PHP
PHP+redis实现添加处理投票的方法
2015/11/14 PHP
php轻松实现文件上传功能
2016/03/03 PHP
PHP7内核之Reference详解
2019/03/14 PHP
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
node.js中的buffer.fill方法使用说明
2014/12/14 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
jQuery使用$.ajax进行异步刷新的方法(附demo下载)
2015/12/04 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记8)
2015/12/24 Javascript
JavaScript中实现无缝滚动、分享到侧边栏实例代码
2016/04/06 Javascript
详细解读Jquery各Ajax函数($.get(),$.post(),$.ajax(),$.getJSON())
2016/08/15 Javascript
在Swiper内如何制作CSS3动画效果示例代码
2017/12/07 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
对vuex中getters计算过滤操作详解
2019/11/06 Javascript
[01:03]DOTA2新的征程 你的脚印值得踏上
2014/08/13 DOTA
深入Python解释器理解Python中的字节码
2015/04/01 Python
python实现将html表格转换成CSV文件的方法
2015/06/28 Python
利用python实现xml与数据库读取转换的方法
2017/06/17 Python
使用 Python 实现微信公众号粉丝迁移流程
2018/01/03 Python
python time.sleep()是睡眠线程还是进程
2019/07/09 Python
Python中six模块基础用法
2019/12/08 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
2020/01/14 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
2020/04/01 Python
如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单
2020/05/24 Python
python中round函数如何使用
2020/06/19 Python
python如何支持并发方法详解
2020/07/25 Python
英国最大线上综合鞋类商城:Office
2017/12/08 全球购物
介绍一下SQL Server的全文索引
2013/08/15 面试题
建筑设计学生的自我评价
2014/01/16 职场文书
留学推荐信怎么写
2014/01/25 职场文书
大学生学习新党章思想汇报
2014/10/25 职场文书
财务会计求职信范文
2015/03/20 职场文书
Python time库的时间时钟处理
2021/05/02 Python