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 相关文章推荐
前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)
Mar 04 Javascript
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
May 10 Javascript
Jquery ajax基础教程
Nov 20 Javascript
JS延时器提示框的应用实例代码解析
Apr 27 Javascript
jquery实用技巧之输入框提示语句
Jul 28 Javascript
Bootstrap响应式侧边栏改进版
Sep 17 Javascript
bootstrap table实例详解
Jan 06 Javascript
vue.js element-ui tree树形控件改iview的方法
Mar 29 Javascript
js中split()方法得到的数组长度问题
Jul 19 Javascript
一文看懂如何简单实现节流函数和防抖函数
Sep 05 Javascript
详解Webpack4多页应用打包方案
Jul 16 Javascript
Vue使用Element实现增删改查+打包的步骤
Nov 25 Vue.js
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实现加密的几种方式介绍
2015/02/22 PHP
php依赖注入知识点详解
2019/09/23 PHP
javascript 写类方式之二
2009/07/05 Javascript
超越Jquery_01_isPlainObject分析与重构
2010/10/20 Javascript
jQuery插件 selectToSelect使用方法
2013/10/02 Javascript
js几秒以后倒计时跳转示例
2013/12/26 Javascript
JavaScript输入邮箱自动提示实例代码
2014/01/13 Javascript
JS实现超精简响应鼠标显示二级菜单代码
2015/09/12 Javascript
Javascript删除指定元素节点的方法
2016/06/21 Javascript
AngularJS中run方法的巧妙运用
2017/01/04 Javascript
Angularjs根据json文件动态生成路由状态的实现方法
2017/04/17 Javascript
bootstrap的常用组件和栅格式布局详解
2017/05/02 Javascript
JS原生带缩略图的图片切换效果
2018/10/10 Javascript
vue中组件的3种使用方式详解
2019/03/23 Javascript
读懂CommonJS的模块加载
2019/04/19 Javascript
解决layui 表单元素radio不显示渲染的问题
2019/09/04 Javascript
[01:18]PWL开团时刻DAY10——一拳超人
2020/11/11 DOTA
使用Python保存网页上的图片或者保存页面为截图
2016/03/05 Python
谈谈如何手动释放Python的内存
2016/12/17 Python
python实现自动解数独小程序
2019/01/21 Python
Python登录系统界面实现详解
2019/06/25 Python
Python中pymysql 模块的使用详解
2019/08/12 Python
python实现的按要求生成手机号功能示例
2019/10/08 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
2020/04/29 Python
k-means 聚类算法与Python实现代码
2020/06/01 Python
Python测试框架:pytest学习笔记
2020/10/20 Python
HTML5 和小程序实现拍照图片旋转、压缩和上传功能
2018/10/08 HTML / CSS
银行简历自我评价
2014/02/11 职场文书
院领导写的就业推荐信
2014/03/09 职场文书
如何写一份好的英文求职信
2014/03/19 职场文书
四议两公开实施方案
2014/03/28 职场文书
青春励志演讲稿
2014/04/29 职场文书
求职信范文大全
2014/05/26 职场文书
争先创优心得体会
2014/09/12 职场文书
工作会议通知
2015/04/15 职场文书
导游词之铁岭象牙山
2019/12/06 职场文书