Javascript 变量作用域 两个可能会被忽略的小特性


Posted in Javascript onMarch 23, 2010

也许有些高手早已知道了,但是我觉得这两个东西还是有一些价值的,所以拿到这里和大家分享一下吧
. 有如下代码:

<script type="text/javascript" > 
function test() { 
with (location) { 
var temp = "an url"; 
} 
alert(temp); 
} 
test(); 
</script>

    调用这个函数会输出什么呢? 也许会认为它会弹出undefined, 但实际上,它弹出的是"an url"这个字符串,这就涉及到JavaScript中变量作用域的一个概念。
JS中,每个作用域都有一个相应的"变量对象"(这么叫不一定准确,知道有这么个东西就行了),这里面存放着当前作用域定义的标识符。JS程序开始的时候,会进入全局作用域, 在我们的程序中,因为全局作用域中定义了test函数,所以它这里的“变量对象”就存放了test函数的标识符。接下来,我们调用了test函数,就进入了,test函数的作用域,test函数本身的作用域也有自己的"变量对象",进入test的作用域的时候,也会把全局作用域里存放的标识符复制进来,所以,在test函数中就可以访问全局作用域中定义的标识符了,但是在外层作用域,是不能看到内层的内容的。如果这样的话,那我们这里的alert(temp)就会输出undefined,因为temp是在内层作用域定义的。但是为什么在这里却能够找到在内层作用域里定义的标识符呢?
    因为with语句块中作用域的"变量对象" 是只读的,所以在他本层定义的标识符,不能存储到本层,而是存储到它的上一层作用域,也就是test函数的作用域,所以,我们的alert(temp)这条语句,就可以访问到那个在内层定义的temp变量了。同样的情形还出现在try catch 语句里面。
.Javascript中没有语句块的概念,代码如下:
if (true) { 
var temp = "oh"; 
} 
alert(temp);

    很简单的几行代码,如果是按照通常的程序语言经验,我们会认为alert语句会报错,然而事实并不是这样,alert语句正常的输出了“oh” 这个字符串,所以在
Javascript中不存在语句块的概念。
    上面两个示例都很简单,也许并不是多高的技术,很多高手应该早已了解,但是这两个语言特性应该还是比较有用的,也许了解这些特性后,在写JS的时候会减少一些出错的机会,所以还是发上来和大家分享一下,希望能够对大家写JS的时候帮助。
Javascript 相关文章推荐
JavaScript Event事件学习第一章 Event介绍
Feb 07 Javascript
JavaScript ECMA-262-3 深入解析.第三章.this
Sep 28 Javascript
基于javascript滚动图片具体实现
Nov 18 Javascript
js对象内部访问this修饰的成员函数示例
Apr 27 Javascript
常见的jQuery选择器汇总
Nov 24 Javascript
javascript中JSON对象与JSON字符串相互转换实例
Jul 11 Javascript
AngularJS 日期格式化详解
Dec 23 Javascript
基于JavaScript实现本地图片预览
Feb 08 Javascript
js微信应用场景之微信音乐相册案例分享
Aug 11 Javascript
对angularJs中2种自定义服务的实例讲解
Sep 30 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
Sep 27 Javascript
vue 使用插槽分发内容操作示例【单个插槽、具名插槽、作用域插槽】
Mar 06 Javascript
JavaScript Perfection kill 测试及答案
Mar 23 #Javascript
锋利的jQuery 第三章章节总结的例子
Mar 23 #Javascript
jQuery 核心函数以及jQuery对象
Mar 23 #Javascript
jquery easyui的tabs使用时的问题
Mar 23 #Javascript
Jquery Ajax学习实例7 Ajax所有过程事件分析示例
Mar 23 #Javascript
jQuery 位置函数offset,innerWidth,innerHeight,outerWidth,outerHeight,scrollTop,scrollLeft
Mar 23 #Javascript
锋利的jQuery 要点归纳(二) jQuery中的DOM操作(下)
Mar 23 #Javascript
You might like
php教程之魔术方法的使用示例(php魔术函数)
2014/02/12 PHP
PHP发送短信代码分享
2015/08/11 PHP
PHP使用mysqli操作MySQL数据库的简单方法
2017/02/04 PHP
IE 缓存策略的BUG的解决方法
2007/07/21 Javascript
javaScript 简单验证代码(用户名,密码,邮箱)
2009/09/28 Javascript
如何编写高质量JS代码
2014/12/28 Javascript
基于jquery实现人物头像跟随鼠标转动
2015/08/23 Javascript
JS冒泡事件与事件捕获实例详解
2016/11/25 Javascript
Express框架之connect-flash详解
2017/05/31 Javascript
JavaScript全屏和退出全屏事件总结(附代码)
2017/08/17 Javascript
解决vue打包项目后刷新404的问题
2018/03/06 Javascript
vue element项目引入icon图标的方法
2018/06/06 Javascript
python使用xmlrpc实例讲解
2013/12/17 Python
MySQL最常见的操作语句小结
2015/05/07 Python
浅谈python对象数据的读写权限
2016/09/12 Python
对Python 两大环境管理神器 pyenv 和 virtualenv详解
2018/12/31 Python
python读写csv文件方法详细总结
2019/07/05 Python
Mac 使用python3的matplot画图不显示的解决
2019/11/23 Python
Python绘制二维曲线的日常应用详解
2019/12/04 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
2020/09/26 Python
Django项目创建及管理实现流程详解
2020/10/13 Python
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
预备党员思想汇报范文
2014/01/11 职场文书
财务人员求职自荐书范文
2014/02/10 职场文书
管理学院毕业生自荐信范文
2014/03/10 职场文书
食品科学与工程专业毕业生求职信范文
2014/07/21 职场文书
五四青年节比赛演讲稿
2015/03/18 职场文书
死者家属慰问信
2015/03/24 职场文书
材料采购员岗位职责
2015/04/03 职场文书
离职证明范本
2015/06/12 职场文书
装修公司管理制度
2015/08/05 职场文书
KTV员工管理制度
2015/08/06 职场文书
2016教师廉洁教育心得体会
2016/01/13 职场文书
基于python实现银行管理系统
2021/04/20 Python
从np.random.normal()到正态分布的拟合操作
2021/06/02 Python
Golang并发工具Singleflight
2022/05/06 Golang