let , var , const 声明变量的区别

文章详细讨论了JavaScript中的var、let和const三种变量声明方式。var存在变量提升和可以被delete删除的特点,而let和const则引入了块级作用域,let不允许重复声明且存在暂时性死区,const声明的变量必须初始化且其值不可变。在严格模式下,未声明的变量会报错。
摘要由CSDN通过智能技术生成

1.var声明

var是es5的关键词

var abc = 'Hello, world';

abcd = "abcd";

var一个变量,系统就会再当前作用域的第一行代码隐式的声明一个变量(提升)

 如果没有var,声明系统帮你创建一个(全局)变量(运行到这里的时候)

var aa = 0;

bb = 1;

console.log(delete aa)//false

console.log(delete bb) // true

  1. 有var,不可以使用delete。无var,可以使用delete。

    ps :delete 是 js 用于删除对象属性和数组元素的,但有var声明的无论是全局变量还是局部变量都不能使用delete(这种属性的configurable=false)。

  2. 严格模式下,使用没有var声明的变量会报错。

        

var 变量提升

变量的提升是指会把变量的声明提升到前面,但是不提升变量赋值;

alert(a);   // Uncaught ReferenceError: a is not defined
a = 100;
alert(b); // undefined
var b = 200;

第二段代码,var声明的全局变量b 在js中会进行代码提升,也就是说var b = 200; 会被分解为 var b;b=200; 代码解析的第时候会将var b; 提升到最前面,并且在内存中开辟一个空间,由于b没有被赋值,默认为undefined。

第一段代码中当js 执行alert() 函数时候由于没有进行var声明,变量没有被提升,不存在内存开辟,所以在alert时候直接报错。

– 解释器在执行js代码的时候,会把所有的声明,包括变量和函数的声明,提到最前面;

– 变量的提升本质上是声明的提升。

2. let 声明

ES6新增加了两个重要的 JavaScript 关键字: letconst

let 声明的变量只在 let 命令所在的代码块内有效(块级作用域、局部作用),ES6 推荐在函数中使用 let 定义变量,而非 var。

1.不存在变量提升

 // console.log(a1);//报错 在初始化之前不能访问a1
        let a1 = "66666";

2.不允许重复声明

  let a2 = 666666;
        // var a2 = "hello";
        console.log(a2);//报错 已存在标识符a2

3.块级作用域:花括号括起来 let声明变量

{
            // 在这个块级作用域中声明的变量只能在声明内部使用
            let a3 = "黄色作用域中的a3";
            console.log(a3);

            {
                // let a3 = "紫色作用域中的a3";
                console.log(a3);
            }

        }

4.暂时性死区:块级作用域中已经声明了,变量就会绑定在这个区域

let a4 = "这是外层作用域中的a4"; {
            // console.log(a4);  报错
            let a4 = "这个块级作用域中的a4";
        }

例:

 if (true) {
            // 暂时性死区开始

            // tmp = 'abc'; // 报错
            // console.log(tmp); // 报错

            // 暂时性死区结束
            let tmp; //
            console.log(tmp); //undefined

            tmp = 123;
            console.log(tmp); //123
        }

5.let声明不存在变量提升

 console.log(typeof cc); //"undefiend"
var cc;
// console.log(typeof c1); //报错
let c1;

6.形参赋值

 // 给形参赋值,es6的写法,形参相当于用let声明
         function bar(x = y, y = 2) {
       let x = y; let y = 2;
           return [x, y];
      }

3. const声明变量

// const关键字声明变量,声明必须初始化,值不能被修改
        const a = 123;
        const a7 = 100;
        // a7 = "yyyyyyy";
        console.log(a7);

        let a8 = 100;
        a8 = "555";
        console.log(a8);

1.不存在变量提升

// console.log(a1); //报错  在初始化之前不能使用a1
        const a1 = "hello666";

2.不允许重复声明

 const a2 = 111;
        // let a2 = 222; //报错 a2已经被声明
        // var a2 = 333; //报错 a2已经被声明
        console.log(a2);

 3.声明了变量必须赋值(变量必须初始化)

// const a3;
        // console.log(a3);//报错 
        let a4;
        console.log(a4);//undefinde

4.const声明的变量会存在块级作用域

const会有作用域链

 {
            const a5 = 6666;

            if (true) {
                // const a5 = 7777;
                console.log(a5);//6666 //因为自己的块级里面已经被注释找上个块级作用域
            }
        }

        // console.log(a5); //报错

5.暂时性死区

const也会有暂时性死区

{
            // console.log(a6);//报错 
            const a6 = "hello";
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值