声明变量(let const var ) 变量提升

目录

一.let

二、const

三.var

四.变量提升   


一.let

   let是 Es6新增语法,用来声明变量。

   作用: 声明一个块级作用域的本地变量

               可以设置初始值

   注意点:1.不能重复声明

                 2.有块级作用域

                 3.不会变量提升

   语法     

       // 声明变量
        let z
            // 声明并赋值
        let a = 10
            //    重新赋值
        a = 55
            //打印结果
        console.log(a) //55

【注意点1-不允许重复声明】

 //let 不允许在相同作用域内,重复声明同一个变量。
        function fu() {
            let a = 10;
        }

        function fu1() {
            let a = 10;
        }

【注意点2-有块级作用域】

 //  它的用法类似与var,但是所有声明的变量,只能在let命令所在的代码块内有效。
        //  在下面代码块之中,分别用let和var声明了两个变量。
        {
            let x = 10;
            var d = 1;
            console.log(x); //10
            console.log(d); //1
        }

        // console.log(x); //x is not defined
        console.log(d) //1
            // 结果let声明的变量报错,var声明的变量返回了正确的值。
            // 这表面,let声明的变量只在它所在的代码有效

【注意点3-不会变提升】

 // var命令发生“变量提升”现象,即变量可以在声明之前使用,值为underfined。
        // 这种现象多多少少是有些奇怪的,按照一般的逻辑,变量应该在声明语句之后才可以使用。
        // 未来纠正这种现象,let命令改变了语法行为,它声明的变量一定要在声明后使用,否则报错。
        // var的情况
        console.log(foo); //undefined
        var foo = 2;
        // let情况
        //  console.log(ber); //Cannot access 'ber' before initialization(无法在初始化之前访问变量)
        let ber = 2;

 二、const

        const声明一个只读的常量。一旦声明,常量的值就不能改变.

    注意点:1.基本类型数据无法重新赋值(引用类型可以改变内容)

                  2.必须设置初始值

                  3.有块级作用域

                  4.不会变量提升

                  5.不能重复声明

语法

const y = 10;

【注意点1 - 基本类型数据无法重新赋值】

        const pi = 3.1415926;
        console.log(pi);
        pi = 5;
        console.log(pi); //Assignment to constant variable.(赋值给常量变量。)

【注意点2 - 必须设置初始值】

         const n;
         console.log(n);//Missing initializer(缺少初始值)
        //中声明不符值,就会报错。

【 注意点3 - 有块级作用域】

       //const的作用域和let命令相同:只在声明的块级作用域有效
        {
            const max = 5;
        }
         console.log(max); //Assignment to constant variable.(赋值到常量变量)
  

【 注意点4 - 不会变量提升】

// const 命令声明的常量也是不能提升,同样存在暂时性死区,只能在声明的位置后面使用。
        {
            console.log(max);//Cannot access 'max' before initialization
            const max = 5;
        }

      在const中,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。

      对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。

       但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针。

       const只能保证这个指针是固定的(即总是指向另一个固定的地址)。

 // 基本数据类型无法重新赋值。
        // 引用类型(对象、数组...),可以更改内容。
        //(注:不能改的是栈)

        const q = [];
        q.push('hello'); //可执行
        console.log(q.length); //1
        a.length = 0; //可执行
        console.log(q.length); //0
        q = ['Dave'] //Assignment to constant variable.(分配给常量变量)
        //上面的代码中,常量q是一个数组,这个数组本身是可以写,但是如果将另一个数组赋值给q,就会报错。

三.var

          var现在基本不用它,但要认识

作用: 1.设置变量

            2.和let非常类似

注意点:1:变量会提升

              2.没有块级作用域

var与let的区别和相同点:1.在只声明变量不赋值时,打印该变量时都是undedined

                                           2.var 变量声明会提前,let无发提升

                                           3.var没有块级作用域,let有块级作用域

语法

// 【语法】
        // 1.声明变量 var food
        //2. 变量声明 + 初始值
        var noodle = '重庆小面' 
       // 3.重新赋值
        noodle = '兰州拉面'
        console.log(noodle); //兰州拉面

        // 【注意点1:变量会提升】 
        console.log(num);
        var num = 10;

        // 【注意点2:没有块级作用域】 
        for (var i = 1; i < 5; i++) {
            console.log('循环内' + i);
        }
        console.log('循环外' + i);

四.变量提升   

 先了解一下 栈内存与堆内存


栈内存:作用域
1.提供一个存放供js代码自上而下执行的环境(代码都是在栈中执行的),

2.由于基本数据源类型值都比较简单,他们都是直接在栈内存中开辟一个位置,把值直接存进去

ps:当栈内存被销毁,存储的那些基本值也就被销毁了。

堆内存:引用值对应的空间
1.存储引用类型值(对象:键值对 函数: 代码字符串)

ps:当前堆内存释放销毁,那么这个引用值彻底没了
 

 变量提升

     变量提升即将变量声明到它所致作用域。

     当栈内存(作用域)形成的,js代码自上而下执行之前,浏览器首先会把带有 “var”、"function"关键字的进行提前“声明”或“定义“,这种预先处理的机制就是变量提升。

声明(declare):var a ; (声明的时候 默认返回值是undefined)

定义(defined):a=12 (定义也可以简单理解为赋值)

//通过var定义(声明)的变量,在定义语句之前就可以访问到。

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


//上面代码实际执行顺序

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

  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值