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 27 Javascript
jquery教程ajax请求json数据示例
Jan 13 Javascript
jQuery scroll事件实现监控滚动条分页示例
Apr 04 Javascript
js将json格式的对象拼接成复杂的url参数方法
May 25 Javascript
JS中的作用域链
Mar 01 Javascript
JavaScript中闭包的详解
Apr 01 Javascript
利用vue开发一个所谓的数独方法实例
Dec 21 Javascript
浅谈vue单一组件下动态修改数据时的全部重渲染
Mar 01 Javascript
详解js location.href和window.open的几种用法和区别
Dec 02 Javascript
jquery实现垂直手风琴菜单
Mar 04 jQuery
Vue实现计算器计算效果
Aug 17 Javascript
JavaScript实现页面高亮操作提示和蒙板
Jan 04 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 图片文件上传实现代码
2010/12/29 PHP
PHP实现页面静态化深入讲解
2021/03/04 PHP
JavaScript自动设置IFrame高度的小例子
2013/06/08 Javascript
IE下通过a实现location.href 获取referer的值
2014/09/04 Javascript
javascript封装简单实现方法
2015/08/11 Javascript
13个PHP函数超实用
2015/10/21 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
2016/05/13 Javascript
jQuery实现每隔几条元素增加1条线的方法
2016/06/27 Javascript
Vue.js 表单校验插件
2016/08/14 Javascript
微信小程序 rpx 尺寸单位详细介绍
2016/10/13 Javascript
简单实现JavaScript图片切换效果
2016/11/28 Javascript
jquery实现简单的瀑布流布局
2016/12/11 Javascript
Angular 2.x学习教程之结构指令详解
2017/05/25 Javascript
JS中图片压缩的方法小结
2017/11/14 Javascript
修改node.js默认的npm安装目录实例
2018/05/15 Javascript
微信小程序实现购物页面左右联动
2019/02/15 Javascript
js比较两个单独的数组或对象是否相等的实例代码
2019/04/28 Javascript
layer页面跳转,获取html子节点元素的值方法
2019/09/27 Javascript
[00:58]PWL开团时刻DAY5——十人开雾0换5
2020/11/04 DOTA
Python 字符串操作方法大全
2014/03/11 Python
Python实现的特征提取操作示例
2018/12/03 Python
浅谈Python中eval的强大与危害
2019/03/13 Python
深入了解Python枚举类型的相关知识
2019/07/09 Python
pytorch模型存储的2种实现方法
2020/02/14 Python
python安装读取grib库总结(推荐)
2020/06/24 Python
Python爬虫抓取指定网页图片代码实例
2020/07/24 Python
使用Python将语音转换为文本的方法
2020/08/10 Python
上海某公司.net方向笔试题
2014/09/14 面试题
求职信格式范本
2013/11/15 职场文书
创建市级文明单位实施方案
2014/03/01 职场文书
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
幼儿园小班教师个人工作总结
2015/02/06 职场文书
辞职书格式样本
2015/02/26 职场文书
办公室主任岗位竞聘书
2015/09/15 职场文书
SQL Server数据库基本概念、组成、常用对象与约束
2022/03/20 SQL Server