es6的声明方式

124 阅读2分钟

声明方式:

let const 声明将替代原来的 var

作用域分为:

1.函数作用域
2.全局作用域

实例:

   for(var i = 0;i<3;i++){
       console.log(i)
   }
   console.log(i); //输出 3
   console.log(window.i); //输出 3
   
   //题解:
    由于var不支持封闭作用域,会直接声明到全局作用域上
    for循环不是个函数作用域,所以i以全局作用显示
    
   //原始解决不挂载全局方法
   (function (){
       for(var i = 0;i<3;i++){
           console.log(i)
       }
       console.log(i); //i is not defined
       console.log(window.i); 
   })()
   
   //es6的解决方法
   //let和{}配合可以产生一个作用域
   for(let i = 0;i<3;i++){
       console.log(i)
   }
   console.log(i); //i is not defined
   console.log(window.i); 
 for(var i = 0;i<3;i++){
     setTimeout(function(){
         console.log(i) //输出3   3   3
     })
 }
 //题解:
  由于setTimeout为异步队列,先执行同步后执行异步,所以执行为for循环才会执行setTimeout,此时的并没有保存每次的i值,故取得是全局i
 
 //原始解决方法
 for(var i = 0;i<3;i++){ 
    (function(i){
       setTimeout(function(){
         console.log(i) //输出3   3   3
     }) 
    })(i)//保存了当前函数i
 }
 
 //es6解决方法
 let支持块级作用域,声明的变量总会声明在当前作用域
 for(let i = 0;i<3;i++){
     setTimeout(function(){
         console.log(i) //输出3   3   3
     })
 }

es6声明好处:

1.解决作用域污染问题和局部作用域的问题

如:实例一

2.解决在同一个作用域下重复声明

 var a = 1;
 var a = 2;  //ok, a = 2
 ----------------------
 let a = 1;
 let a = 2; //no,报错
 -----------------------
 let a = 1;
 var a = 2;//no,报错
 -----------------------
 let a =1;
 function aa(){
     let a = 2; //ok,两个a的作用域不同
 }

3.不支持域解释问题【变量提升】

console.log (a); //undefined,声明未赋值
var a = 1;
---------------------------------------
console.log (a); //a is not defined,未声明何谈赋值
let a = 1;

const:通过const声明的变量不能被修改,不能被修改引用空间

 const a = 1;
 a = 2; //no,常量不可修改
 --------------------------------------
 const a = {name:"小明"}
 a.age = 9
 console.log(a); //{name:"小明",age:9}