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 相关文章推荐
基于jquery的15款幻灯片插件
Apr 10 Javascript
jQuery插件开发全解析
Oct 10 Javascript
JavaScript截取字符串的Slice、Substring、Substr函数详解和比较
Mar 20 Javascript
JavaScript实现在标题栏上显示当前日期的方法
Mar 19 Javascript
JS中artdialog弹出框控件之提交表单思路详解
Apr 18 Javascript
浅谈JavaScript函数的四种存在形态
Jun 08 Javascript
jQuery设置聚焦并使光标位置在文字最后的实现方法
Aug 02 Javascript
JS中超越现实的匿名函数用法实例分析
Jun 21 Javascript
简单了解微信小程序的目录结构
Jul 01 Javascript
vue中js判断长时间不操作界面自动退出登录(推荐)
Jan 22 Javascript
Vue-router编程式导航的两种实现代码
Mar 04 Vue.js
Three.js实现雪糕地球的使用示例详解
Jul 07 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 foreach 使用&amp;(与运算符)引用赋值要注意的问题
2010/02/16 PHP
php实现有趣的人品测试程序实例
2015/06/08 PHP
Linux下快速搭建php开发环境
2017/03/13 PHP
php设计模式之职责链模式定义与用法经典示例
2019/09/19 PHP
jQuery事件绑定.on()简要概述及应用
2013/02/07 Javascript
javascript获取元素偏移量的方法有哪些
2014/06/24 Javascript
jquery实现键盘左右翻页特效
2015/04/30 Javascript
浅谈javascript获取元素transform参数
2015/07/24 Javascript
使用JQuery中的trim()方法去掉前后空格
2016/09/16 Javascript
jQuery EasyUI中的日期控件DateBox修改方法
2016/11/09 Javascript
Linux CentOS系统下安装node.js与express的方法
2017/04/01 Javascript
Node.js Mongodb 密码特殊字符 @的解决方法
2017/04/11 Javascript
JS实现简单的天数计算器完整实例
2017/04/28 Javascript
详解JS构造函数中this和return
2017/09/16 Javascript
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
node.js的exports、module.exports与ES6的export、export default深入详解
2017/10/26 Javascript
js this 绑定机制深入详解
2020/04/30 Javascript
Python Sleep休眠函数使用简单实例
2015/02/02 Python
python爬虫基本知识
2018/03/05 Python
Python 实现选择排序的算法步骤
2018/04/22 Python
python 读取txt中每行数据,并且保存到excel中的实例
2018/04/29 Python
Python连接Mssql基础教程之Python库pymssql
2018/09/16 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
2019/04/17 Python
Python使用线程来接收串口数据的示例
2019/07/02 Python
Django的Modelforms用法简介
2019/07/27 Python
python TK库简单应用(实时显示子进程输出)
2019/10/29 Python
浅谈Django中的QueryDict元素为数组的坑
2020/03/31 Python
基于Python实现天天酷跑功能
2021/01/06 Python
HUGO BOSS美国官方网上商店:世界知名奢侈品牌
2017/08/04 全球购物
Java中会存在内存泄漏吗,请简单描述
2016/12/22 面试题
财务部经理岗位职责
2014/02/03 职场文书
私人会所最新创业计划书范文
2014/03/24 职场文书
党的群众路线教育实践方案
2014/05/11 职场文书
煤矿安全知识竞赛活动总结
2014/07/07 职场文书
驾驶员安全责任书范本
2014/07/24 职场文书
2014党的群众路线教育实践活动总结材料
2014/10/31 职场文书