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判断访问的来源是手机还是电脑,用的哪种浏览器
Dec 12 Javascript
javascript使用call调用微信API
Dec 15 Javascript
原生js实现类似弹窗抖动效果
Apr 02 Javascript
jquery实现动画菜单的左右滚动、渐变及图形背景滚动等效果
Aug 25 Javascript
jQuery 中ajax异步调用的四种方式
Jun 28 Javascript
巧用Javascript的逻辑运算符
Dec 02 Javascript
JS使用正则截取两个字符串之间的字符串实现方法详解
Jan 06 Javascript
浅析vue component 组件使用
Mar 06 Javascript
Vue打包后出现一些map文件的解决方法
Feb 13 Javascript
angularJS实现动态添加,删除div方法
Feb 27 Javascript
AngularJS实现的base64编码与解码功能示例
May 17 Javascript
ES6数组与对象的解构赋值详解
Jun 14 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描述) 简单选择排序 simple selection sort
2011/08/09 PHP
PHP解决高并发的优化方案实例
2020/12/10 PHP
用AJAX返回HTML片段中的JavaScript脚本
2010/01/04 Javascript
用javascript关闭本窗口不弹出询问框的方法
2014/09/12 Javascript
Bootstrap媒体对象的实现
2016/05/01 Javascript
js控制文本框只能输入中文、英文、数字与指定特殊符号的实现代码
2016/09/09 Javascript
Angular2从搭建环境到开发步骤详解
2016/10/17 Javascript
js判断一个字符串是以某个字符串开头的简单实例
2016/12/27 Javascript
Express系列之multer上传的使用
2017/10/27 Javascript
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
Vue实现一个图片懒加载插件
2019/03/11 Javascript
layui实现给某一列加点击事件
2019/10/26 Javascript
js实现烟花特效
2020/03/02 Javascript
详解vue中v-on事件监听指令的基本用法
2020/07/22 Javascript
绘制微信小程序验证码功能的实例代码
2021/01/05 Javascript
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
Python扫描IP段查看指定端口是否开放的方法
2015/06/09 Python
从列表或字典创建Pandas的DataFrame对象的方法
2019/07/06 Python
Python带参数的装饰器运行原理解析
2020/06/09 Python
Python判断字符串是否为合法标示符操作
2020/09/03 Python
详解Python yaml模块
2020/09/23 Python
英国的知名精品百货公司:House of Fraser(福来德)
2016/08/14 全球购物
全球最大最受欢迎的旅游社区:Tripadvisor
2017/11/03 全球购物
2014年应届大学生自我评价
2014/01/09 职场文书
《我的第一本书》教学反思
2014/02/15 职场文书
《赵州桥》教学反思
2014/02/17 职场文书
《菜园里》教学反思
2014/04/17 职场文书
银行求职信范文
2014/05/26 职场文书
专升本学生毕业自我鉴定
2014/10/04 职场文书
个性与发展自我评价
2015/03/06 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书
2016年春季开学典礼新闻稿
2015/11/25 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
Node.js实现断点续传
2021/06/23 Javascript
Python+pyaudio实现音频控制示例详解
2022/07/23 Python