Javascript 变量作用域 两个可能会被忽略的小特性

 更新时间:2010年03月23日 22:56:43   作者:  
关于Javascript,大家肯定都很熟悉啦,对于有编程经验的朋友来说,Javascript很快就能上手,不过关于JS的变量作用域,还是有一点差别的。
也许有些高手早已知道了,但是我觉得这两个东西还是有一些价值的,所以拿到这里和大家分享一下吧
. 有如下代码:
复制代码 代码如下:

<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的时候帮助。

相关文章

  • JSONObject与JSONArray使用方法解析

    JSONObject与JSONArray使用方法解析

    这篇文章主要介绍了JSONObject与JSONArray使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 一起来了解一下JavaScript的预编译(小结)

    一起来了解一下JavaScript的预编译(小结)

    这篇文章主要介绍了一起来了解一下JavaScript的预编译(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 解决页面js接受Long型损失精度问题(最新解决方案)

    解决页面js接受Long型损失精度问题(最新解决方案)

    这篇文章主要介绍了解决页面js接受Long型损失精度问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • echarts中tooltip添加点击事件代码示例

    echarts中tooltip添加点击事件代码示例

    这篇文章主要给大家介绍了关于echarts中tooltip添加点击事件的相关资料,echarts tooltip点击事件是指当用户点击图表中的提示框(tooltip)时触发的事件,需要的朋友可以参考下
    2023-07-07
  • JS实现身份证输入框的输入效果

    JS实现身份证输入框的输入效果

    这篇文章主要介绍了JS实现身份证输入框的输入效果,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-08-08
  • javascript 兼容各个浏览器的事件

    javascript 兼容各个浏览器的事件

    这篇文章主要介绍了javascript 兼容各个浏览器的事件,需要的朋友可以参考下
    2015-02-02
  • 关于JS数组追加数组采用push.apply的问题

    关于JS数组追加数组采用push.apply的问题

    JS数组追加数组没有现成的函数,这么多年我已经习惯了a.push.apply(a, b);这种自以为很酷的,不需要写for循环的写法,一直也没遇到什么问题,直到今天我要append的b是个很大的数组时才遇到了坑。
    2014-06-06
  • IScroll5 中文API参数说明和调用方法

    IScroll5 中文API参数说明和调用方法

    IScroll是移动页面上被使用的一款仿系统滚动插件。IScroll5相对于之前的IScroll4改进了许多,使得大家可以更方便的定制所需的功能了。
    2016-05-05
  • js变量作用域及可访问性的探讨

    js变量作用域及可访问性的探讨

    js变量作用域及可访问性的探讨...
    2006-11-11
  • 原生Javascript插件开发实践

    原生Javascript插件开发实践

    本文主要介绍了原生Javascript插件开发的思路分析以及使用示例。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01

最新评论