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 操作cookies及正确使用cookies的属性
Oct 15 Javascript
jQuery使用hide方法隐藏元素自身用法实例
Mar 30 Javascript
JavaScript生成验证码并实现验证功能
Sep 24 Javascript
js日期相关函数dateAdd,dateDiff,dateFormat等介绍
Sep 24 Javascript
微信小程序 网络请求(GET请求)详解
Nov 16 Javascript
Js apply方法详解
Feb 16 Javascript
JavaScript之Map和Set_动力节点Java学院整理
Jun 29 Javascript
vue-cli 3.0 版本与3.0以下版本在搭建项目时的区别详解
Dec 11 Javascript
前端深入理解Typescript泛型概念
Mar 09 Javascript
JS XMLHttpRequest原理与使用方法深入详解
Apr 30 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
Nov 18 jQuery
Javascript中window.name属性详解
Nov 19 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函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
2015/10/27 PHP
php原生数据库分页的代码实例
2019/02/18 PHP
用cookies实现的可记忆的样式切换效果代码下载
2007/12/24 Javascript
再说AutoComplete自动补全之实现原理
2011/11/05 Javascript
jcrop基本参数一览
2013/07/16 Javascript
JS随机生成不重复数据的实例方法
2013/07/17 Javascript
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
jQuery on()方法示例及jquery on()方法的优点
2015/08/27 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
JavaScript setTimeout使用闭包功能实现定时打印数值
2015/12/18 Javascript
谈一谈bootstrap响应式布局
2016/05/23 Javascript
uploader秒传图片到服务器完整代码
2017/04/22 Javascript
Javascript中八种遍历方法的执行速度深度对比
2017/04/25 Javascript
vue-cli webpack 引入jquery的方法
2018/01/10 jQuery
Koa日志中间件封装开发详解
2019/03/09 Javascript
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
2015/03/30 Python
python中lambda与def用法对比实例分析
2015/04/30 Python
用Python抢过年的火车票附源码
2015/12/07 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
2016/06/27 Python
Python中__init__.py文件的作用详解
2016/09/18 Python
Pycharm学习教程(3) 代码运行调试
2017/05/03 Python
Windows环境下python环境安装使用图文教程
2018/03/13 Python
numpy添加新的维度:newaxis的方法
2018/08/02 Python
windows10下安装TensorFlow Object Detection API的步骤
2019/06/13 Python
python并发编程 Process对象的其他属性方法join方法详解
2019/08/20 Python
Python中filter与lambda的结合使用详解
2019/12/24 Python
Pycharm内置终端及远程SSH工具的使用教程图文详解
2020/03/19 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
2020/11/18 Python
迪卡侬波兰体育用品商店:Decathlon波兰
2020/03/31 全球购物
销售总监工作职责
2013/11/21 职场文书
国贸专业自荐信范文
2014/03/02 职场文书
2015年农村党员公开承诺事项
2015/04/28 职场文书
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
2021/06/03 Python
「租借女友」第2季樱泽墨角色PV&新视觉图公开
2022/03/21 日漫
教你在 Java 中实现 Dijkstra 最短路算法的方法
2022/04/08 Java/Android