比较var和let的区别,理解函数作用域与块级作用域

var与 let的区别:

var:函数作用域;存在变量提升;可重复定义;声明的变量作为window的属性。

let:块级作用域;不存在变量提升(有暂时性死区);不可重复定义;声明的变量不会作为window的属性。

 

块级作用域:即在{}花括号内的域,由{ }包括,比如if{}块、for(){}块。

函数作用域:变量在声明它们的函数体以及这个函数体嵌套的任意函数体都是有定义的。

暂时性死区:在代码块中,在声明变量之前,该变量是不可用的。

 

JS中作用域有:全局作用域、函数作用域,是没有块作用域的。块级作用域是ES6中的。

var是js的,作用域是函数作用域的,let是ES6的,作用域是块级作用域的。

下面看下例子比较:

<script>
           function test11(){
                console.log('函数内声明前使用var变量',num);//undefined
                var num=23;

                // console.log('函数内声明前使用let变量',firstname);//报错:firstname is not defined
                let firstname;
            };
            test11();
            // console.log("函数内声明函数外使用var变量:",num);//报错:num is not defined
            // console.log("函数内声明函数外使用let变量:",firstname);//报错:firstname is not defined

            if(true) {
                let c = 3;
                if(true) {
                    console.log('c:',c);
                }

                console.log('块内声明前使用var',num);//undefined
                var num=2;
            }
            console.log("块外使用var:",num);//2 (没赋值的话打印undefined)
            console.log("块外使用let:",c);//报错:c is not defined
</script>

通过上述例子可见,var定义的变量是受到函数作用域限制的,不受if{}块作用域的限制。在函数内声明前使用var变量只是打印出undefined,而在函数外使用却报错is not defined。而在if{}块作用域内声明前使用和在块内声明后块外使用,也只是打印出undefined,并不会报错。说明var定义的变量的是否可见是受函数作用域限制的,但不受块作用域的限制。

再看let定义的变量,是受块作用域的限制的。let定义的变量不管是在函数内声明前使用,还是函数内声明后函数外使用,及块内声明块外使用都报错is not defined。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章