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 相关文章推荐
css transform 3D幻灯片特效实现步骤解读
Mar 27 Javascript
JavaScript实现twitter puddles算法实例
Dec 06 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
Feb 10 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
Oct 14 Javascript
每天一篇javascript学习小结(Array数组)
Nov 11 Javascript
JS实现title标题栏文字不间断滚动显示效果
Sep 07 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
Dec 08 Javascript
Javacript中自定义的map.js  的方法
Nov 26 Javascript
jquery实现侧边栏左右伸缩效果的示例
Dec 19 jQuery
webpack 静态资源集中输出的方法示例
Nov 09 Javascript
es6函数之尾调用优化实例分析
Apr 25 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
Jul 13 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
星际争霸 Starcraft 发展史
2020/03/14 星际争霸
详解PHP导入导出CSV文件
2014/11/03 PHP
PHP MVC框架路由学习笔记
2016/03/02 PHP
thinkphp关于简单的权限判定方法
2017/04/03 PHP
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
js修改input的type属性问题探讨
2013/10/12 Javascript
浏览器环境下JavaScript脚本加载与执行探析之defer与async特性
2016/01/14 Javascript
第九章之路径分页标签与徽章组件
2016/04/25 Javascript
微信小程序 页面传参实例详解
2016/11/16 Javascript
jQuery Form表单取值的方法
2017/01/11 Javascript
js获取浏览器和屏幕的各种宽度高度
2017/02/22 Javascript
Vue2.0使用过程常见的一些问题总结学习
2017/04/10 Javascript
JavaScript中Hoisting详解 (变量提升与函数声明提升)
2017/08/18 Javascript
浅谈vue中慎用style的scoped属性
2017/11/28 Javascript
基于Vue 2.0的模块化前端 UI 组件库小结
2017/12/21 Javascript
nodejs 十六进制字符串型数据与btye型数据相互转换
2018/07/30 NodeJs
CountUp.js数字滚动插件使用方法详解
2019/10/17 Javascript
浅谈Vue 函数式组件的使用技巧
2020/06/16 Javascript
微信小程序实现发微博功能的示例代码
2020/06/24 Javascript
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
python转换字符串为摩尔斯电码的方法
2015/07/06 Python
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
2016/06/07 Python
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
2018/03/14 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
2018/07/25 Python
Django中使用session保持用户登陆连接的例子
2019/08/06 Python
python 协程中的迭代器,生成器原理及应用实例详解
2019/10/28 Python
Python 模拟动态产生字母验证码图片功能
2019/12/24 Python
Python 识别12306图片验证码物品的实现示例
2020/01/20 Python
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
数以千计的折扣工业产品:ESE Direct
2018/05/20 全球购物
绘儿乐产品官方在线商店:Crayola.com
2019/09/07 全球购物
Kiehl’s科颜氏西班牙官方网站:源自美国的植物护肤品牌
2020/02/22 全球购物
开展读书活动总结
2014/06/30 职场文书
2014学习优秀共产党员先进事迹材料思想汇报
2014/09/14 职场文书
2016学习依法治国心得体会
2016/01/15 职场文书