简单理解:JavaScript中三个声明变量的关键字:var、let、const [ECMAScript规则]

理解JS中三个声明变量的关键字前提-基本知识点介绍:

1.ECMAScript:是由Ecma(欧洲计算机制造商协会)找了一群世界各地的前端大佬聚在一起所研究讨论出来的一套脚本语言的语法规则。为的是避免网景公司和微软公司两个当时的互联网巨头,为了争夺前端领导权所研究出的自成体系的两个版本的JavaScript由于各有一套规则所导致的前端行业的混乱,所以Ecma商会出面,定下一套统一的规则。

2.EcmaScript规则决定了JS脚本语言中的变量是松散类型的,也就是说我们声明的这个变量可以保存任何类型的数据。不像C语言那样需要给到变量确定的类型和数值。

3.因此每个变量只是用来保存任意值的命名占位符。而这三个关键字var、let、const的作用只是声明这个变量在相关、特定的作用域(函数作用域、以及函数作用域的子作用域块)中如何存在因为JS中的变量"不关心"我们给它什么类型的数据。它只关心自己的作用域和作用域下它的"被访问权限"。

4.于是我们要学习的就是关键字var、let、const它们三个各自声明出来的变量具有什么样的作用域和自己独有的特点。而不去关心它们声明了什么样的数据类型。

5.定义变量:声明变量关键字    变量名 ;

           或者   声明变量关键字    变量名 = 任何值;

6.由于这里是简单理解,因此一些知识点省略,如let和var 的全局声明与window对象的属性、let的条件声明、for循环中let的声明、const中的for循环。

 var关键字

【1】定义变量:

        var msg = 1;  这样的初始化变量不会将它标识为字符串类型,只是简单的赋值而已。随后我们可以任意的改变值,哪怕类型不同

        var msg = 1;

        msg = 'hello';        //合法,但不推荐
        
        var a;    //undefined

        var允许我们只声明不赋值,那么这个变量会保存一个特殊值undefined。

【2】var 声明作用域

使用var声明的变量会成为包含它的函数的局部变量。也就是说它只在包含它的函数里才有效。当函数被调用之后随即被销毁。例如:

    function test() {
            var a = 1;
            console.log(a);    //1
        }
    console.log(a); //Uncaught ReferenceError: a is not defined
                    //因为a只在它的函数test里面有效

也可以在函数内部定义变量时省略var关键字,可以创建一个全局变量。但是不推荐这样做,因为别人在阅读、修改代码时会很麻烦,他如果不从上往下看 上哪知道这是个全局变量而且还是省略var 声明出来的。

 function test() {
            a = 1;    //全局变量
            console.log(a);    //1
        }
    test();    
    console.log(a); //1

【3】var声明提升

使用var关键字声明的变量在JS解析器解析时会把声明提升到函数作用域的最前面

例如:

 function test() {
            console.log(a);
            var a = 1;
        }
    test();    //undefined

因为这相当于

function test() {
            var a;
            console.log(a);
            a = 1;
        }
    test();    //undefined
               //只把声明提前,赋值该在哪里在哪里赋值

let关键字 

【1】let和var 的主要区别在于var 的范围是函数作用域,而let声明的范围是块作用域,例如if块。

       if(true) {
           var a = 1; //这是块作用域属于函数作用域子域所以a是可以在if块外面访问到的
           console.log(a);//1
       }
       console.log(a);//1

       if(true) {
           let b = 2;
           console.log(b);//2
       }
       console.log(b);//Uncaught ReferenceError: b is not defined
                      //let适用范围就是所在的块,在这里就是if(){},
                      出了花括号就没权限访问了

【2】let 可以在不同范围定义相同的变量名。

        let a = 1;
        if(true) {
            let a = 2;//不与a=1冲突,因为这个a 的作用域是这个if块
            let b = 3;
            console.log(a);//2
        }
        console.log(a);//1
        console.log(b);//Uncaught ReferenceError: b is not defined

【3】和var相对的,let声明不会被提升。 称为暂时性死区

console.log(a);
var a = 1;//undefined

console.log(b);
let b = 2;//Uncaught ReferenceError: Cannot access 'b' before initialization

const关键字

【1】const和let基本相同,唯一一个重要区别是const声明的同时必须赋值。而且不能修改变量的值。但是const只适用于它指向的变量的引用,但是修改这个变量的内部属性是可以的。

const a = 1;
a = 1;//Uncaught TypeError: Assignment to constant variable.

const b = {};
b = 1;//Uncaught TypeError: Assignment to constant variable.
b.name = 'ss';//可以
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值