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 Array.remove() 数组删除
Aug 06 Javascript
JavaScript中将一个值转换为字符串的方法分析[译]
Sep 21 Javascript
jQuery中:input选择器用法实例
Jan 03 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
Mar 01 Javascript
浅谈js键盘事件全面控制
Dec 01 Javascript
jQuery:unbind方法的使用详解
Aug 14 jQuery
JS写XSS cookie stealer来窃取密码的步骤详解
Nov 20 Javascript
浅谈React中的元素、组件、实例和节点
Feb 27 Javascript
vue: WebStorm设置快速编译运行的方法
Oct 18 Javascript
详解基于node.js的脚手架工具开发经历
Jan 28 Javascript
vue使用nprogress实现进度条
Dec 09 Javascript
关于JS中的作用域中的问题思考分享
Apr 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中ob(Output Buffer 输出缓冲)函数使用方法
2007/07/21 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
Javascript 面向对象 继承
2010/05/13 Javascript
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
jquery获取当前点击对象的value方法
2014/02/28 Javascript
JS实现可拖曳、可关闭的弹窗效果
2015/09/26 Javascript
详解javascript实现瀑布流绝对式布局
2016/01/29 Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
2016/08/06 Javascript
jQuery特殊符号转义的实现
2016/11/30 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
angular.js实现列表orderby排序的方法
2018/10/02 Javascript
一起写一个即插即用的Vue Loading插件实现
2019/10/31 Javascript
[04:42]5分钟带你了解什么是DOTA2(第一期)
2017/02/07 DOTA
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
Python正则表达式的使用范例详解
2014/08/08 Python
python使用arp欺骗伪造网关的方法
2015/04/24 Python
Python读取键盘输入的2种方法
2015/06/16 Python
Python分支结构(switch)操作简介
2018/01/17 Python
编写多线程Python服务器 最适合基础
2018/09/14 Python
对python for 文件指定行读写操作详解
2018/12/29 Python
对python3中, print横向输出的方法详解
2019/01/28 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
2019/11/11 Python
jupyter notebook 重装教程
2020/04/16 Python
python从PDF中提取数据的示例
2020/10/30 Python
Sneaker Studio匈牙利:购买运动鞋
2018/03/26 全球购物
莫斯科高科技在线商店:KremlinStore
2019/03/13 全球购物
高校学生干部的自我评价分享
2013/11/04 职场文书
家长会学生家长演讲稿
2013/12/29 职场文书
房地产还款计划书
2014/01/10 职场文书
家长给小学生的评语
2014/01/30 职场文书
小学生暑假家长评语
2014/04/17 职场文书
国际贸易本科毕业生求职信
2014/09/26 职场文书
关于工作经历的证明书
2014/10/11 职场文书
优秀党员事迹材料
2014/12/18 职场文书
2015年大学组织委员个人工作总结
2015/10/23 职场文书
三八红旗手主要事迹材料
2015/11/04 职场文书