比较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。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值