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 相关文章推荐
用tip解决Ext列宽度不够的问题
Dec 13 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
Sep 21 Javascript
Jqgrid表格随窗口大小改变而改变的简单实例
Dec 28 Javascript
在Javascript中处理字符串之big()方法的使用
Jun 08 Javascript
以Python代码实例展示kNN算法的实际运用
Oct 26 Javascript
js事件驱动机制 浏览器兼容处理方法
Jul 23 Javascript
JS判断form内所有表单是否为空的简单实例
Sep 09 Javascript
Vuejs在v-for中,利用index来对第一项添加class的方法
Mar 03 Javascript
vue路由拦截及页面跳转的设置方法
May 24 Javascript
jQuery表单选择器用法详解
Aug 22 jQuery
layui 富文本编辑器和textarea值的相互传递方法
Sep 18 Javascript
详解ES6 CLASS在微信小程序中的应用实例
Apr 24 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
咖啡豆要不要放冰箱的原因
2021/03/04 冲泡冲煮
十天学会php之第十天
2006/10/09 PHP
php中的PHP_EOL换行符详细解析
2013/10/26 PHP
部署PHP项目应该注意的几点事项分享
2013/12/20 PHP
php中mkdir函数用法实例分析
2014/11/15 PHP
php判断对象是派生自哪个类的方法
2015/06/20 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
wordpress网站转移到本地运行测试的方法
2017/03/15 PHP
用js得到网页中所有的div的id
2020/10/19 Javascript
javawscript 三级菜单的实现原理
2009/07/01 Javascript
jquery 页面全选框实践代码
2010/04/02 Javascript
js判断某个方法是否存在实例代码
2015/01/10 Javascript
jquery带下拉菜单和焦点图代码分享
2015/08/24 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
2015/08/24 Javascript
jquery实现简单文字提示效果
2015/12/02 Javascript
AngularJs html compiler详解及示例代码
2016/09/01 Javascript
JS实现的手机端精简幻灯片效果
2016/09/05 Javascript
AngularJS通过$http和服务器通信详解
2016/09/21 Javascript
javascript实现table单元格点击展开隐藏效果(实例代码)
2017/04/10 Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
2017/05/24 Javascript
解决cordova+vue 项目打包成APK应用遇到的问题
2019/05/10 Javascript
[01:24]2014DOTA2 TI第二日 YYF表示这届谁赢都有可能
2014/07/11 DOTA
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
Django项目实战之用户头像上传与访问的示例
2018/04/21 Python
Python多继承顺序实例分析
2018/05/26 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
使用html5制作loading图的示例
2014/04/14 HTML / CSS
介绍一下gcc特性
2015/10/31 面试题
市场营销专业个人自荐信格式
2013/09/21 职场文书
运动会观后感
2015/06/09 职场文书
毕业设计工作总结
2015/08/14 职场文书
月考总结与反思
2015/10/22 职场文书
小学中队委竞选稿
2015/11/20 职场文书
一个家长教育孩子的心得体会
2016/01/15 职场文书
七年级作文之雪景
2019/11/18 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书