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

2019-12-24,,,

也许有些高手早已知道了,但是我觉得这两个东西还是有一些价值的,所以拿到这里和大家分享一下吧
. 有如下代码:
复制代码 代码如下:
<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中的作用域链和闭包
  • javascript作用域容易记错的两个地方分析
  • 深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
  • 浅谈javascript中的作用域
  • js变量以及其作用域详解
  • js使用函数绑定技术改变事件处理程序的作用域
  • javascript权威指南 学习笔记之变量作用域分享
  • javascript中的作用域scope介绍
  • 关于JavaScript中var声明变量作用域的推断
  • JavaScript.The.Good.Parts阅读笔记(二)作用域&闭包&减缓全局空间污染
  • JavaScript中实现块作用域的方法
  • Javascript学习笔记3 作用域
  • JavaScript的变量作用域深入理解
  • Javascript 作用域使用说明
  • JavaScript 变量作用域及闭包
  • javascript 变量作用域 代码分析
  • javascript变量作用域使用中常见错误总结

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

下载本文的Word格式文档,以方便收藏与打印。