javascript es6 新特性 var let const (一)

  首先在学习 es6 新特性的时候,我们在来回顾一下 es5 的内容 在es5中只要两个作用域 分别为 全局作用域 和 函数作用域

     

  全局作用域(在es5中 全局作用域 和 window 是挂钩的 )

   var a = 1;
   window.a = 2;
   console.log(a); //2 var a === window.a

 全局变量的声明方式有哪些呢?
 
  在函数外部 使用 var 声明的变量 为 全局变量
    
    var a = 1; // 全局变量

  在 for(var i = 0; ;) 里面使用 var 声明的变量是全局变量

   for(var i = 0; i < 5; i++){
    
   }
   console.log(i); //5

  在 function 里面不使用 var 声明的变量为 全局变量

    (function () { //一个立即执行的函数
      b = 1;
    })();
    console.log(b); // 1

  函数作用域(在函数内部使用 var 声明的变量)

    function num(){
      var c = 1;
      console.log(c); //1
    }
    num();
    console.log(c); // Uncaught ReferenceError: c is not defined
    // 函数作用域 只能在函数内部可以访问



了解了 var 在 es5 中 的特性那么接下里我们来说说 es6 中新增的两个命令 let 和 const
  
  首先我们来了解 let 命令的特性 let 和 var 类似 都是用来声明变量 但是 let 声明的变量它的作用域 只在 let 命令所在的代码块有效
  
  {
      let a = 1;
      var b = 2;
    }
    console.log(a); // ReferenceError: a is not defined.
    console.log(b); // 2
  

  当我们使用 for(var i =0;;) 来绑定事件的时候 最终的运行结果 和我们预想的有偏差 这是为什么呢?
    var element = self.document.getElementByClassName("div");  // 假设 element 查找到 三个div 现在要给这三个div 添加点击事件
    for(var i =0; i< element.length ; i++){
      element[i].onclick = function(){
        alert(i); //不管点击那个div 都出弹出3
      }
    }
    当我们点击div 的时候发现不管点击那个div 都是弹出的 3 。

      这是因为 变量ivar命令声明的,在全局范围内都有效,所以全局只有一个变量i。每一次循环,变量i的值都会发生改变,
      而循环内被赋给数组a的函数内部的alert(i),里面的i指向的就是全局的i。也就是说,所有alert(i)里面的i,指向的都是同一个i
      导致运行时输出的是最后一轮的i的值,也就是 3。

    而使用 let 在for 里面声明变量则没有这个问题
      var element = self.document.getElementByClassName("div");  // 假设 element 查找到 三个div 现在要给这三个div 添加点击事件
        for(let i =0; i< element.length ; i++){
          element[i].onclick = function(){
            alert(i); //弹出正常
          }
        }
      这是因为变量ilet声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,
      你可能会疑惑,如果每一轮循环的变量i都是重新声明的,那它怎么知道上一轮循环的值,
      从而计算出本轮循环的值?这是因为 JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。
  
  变量提升
    什么是变量提升呢?即变量可以在声明之前使用 他的值为 undefined 这种现象一般都发生在 使用 var 命令声明的变量
      console.log(a); // undefined
      var a = 1;

      console.log(b); // 报错
      let b = 1;

      关于变量提示 现在有歧义  部分人认为 let const 不存在变量提示 而另外一部分人认为 let const 存在有变量提示 但没有初始化值 博主比较偏向后一种

未完待续...
  
 
posted @ 2021-05-21 10:08  陌媣  阅读(61)  评论(0)    收藏  举报