JavaScript块级作用域

在学习js的作用域时有一个非常有意思的例子:

<script type="text/javascript">
    var x = 1;
    function rain(){
        alert( x );        //弹出 'undefined',而不是1
        var x = 'rain-man';
        alert( x );        //弹出 'rain-man'
    }
    rain();
</script>

产生这种结果的原因是在js中,局部变量x的作用域是函数作用域,也就是说它在一开始就已经被声明了,此时程序并不会去寻找全局变量x,而是寻找局部变量x,但此时局部变量x还未被初始化,因此会得到undefined的结果。这种声明的特性可以称之为“变量提升”。
JavaScript中使用let和const关键字来实现块级作用域。

let

let关键字声明主要有两个特点

  1. 声明的变量是局部的,但为了与同样是局部的函数作用域区别,称之为块级作用域,同时包含了变量的作用域只在所属大括号包围(块)内的含义
  2. 声明不具有“变量提升”的特性,而是称之为“暂时性死区”特性
    例如上面的例子:
// 特点1
    function rain(){      
        let x = 'rain-man';
}
alert( x );        // Error: x is not defined
// 特点2
    function rain(){
        alert( x );         // Error: x is not defined
        let x = 'rain-man';
        alert( x );        
    }
    rain();

第二个例子说明,程序一样知道rain函数中声明了x,但let的块级作用域特性使其忽略掉了该声明,报出了变量未声明的错误,否则就是“变量提升”。

const

与let类似,只不过const另外有一层与强类型语言相似的含义,即变量为常量,必须在声明时初始化,且值不能被改变。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容