ES6-let/const的使用

var定义变量

  • var定义的变量挂载到window上了

var定义变量存在的问题

var b = 6;
var b = 9;//后定义的同名key会覆盖之前的key
console.log(b)//6

for (var i = 0; i < 10; i++) {
    
    //小括号里面的i是一个全局变量 通过var定义的变量只有函数内部的局部变量和全局变量之分,for循环if判断中定义的都是全局变量
  //js的执行逻辑
  //(1)在js主程序(单线程)上的同步任务形成了一个主任务执行栈
  //(2)主线程之外还存在一个任务队列,这个队列存在一些按时间顺序存放的事件,如鼠标点击、计时触发等,主线程中每出现一个异步任务,任务队列就会增加一个异步任务的事件
  //(3)一般执行栈中的同步任务执行完毕,系统就会读取任务队列,看看哪些事件是可以执行的,一旦可以执行将进入执行栈开始执行
  //(4)不断重复以上动作

  //如果真的用var,这里面就不能存在不进行特别处理的异步操作,因为for(这里面是直接在主任务执行栈上操作的){
    
    
  //这里面的异步操作不在主程序栈上执行操作,需要等到主程序都执行完再执行}

  (function (i) {
    
    //这样的特殊处理
    setTimeout(() => {
    
    
      console.log(i);
    }, 1000 * i);
  })(i);
};
console.log(i);//10由于定义的是全局变量,导致污染了全局变量

if (true) {
    
    
  var a = 12;//相当于定义了一个全局变量   
}
console.log(a)//12

let定义变量的特点

let在同一个块级作用域中不能重复的定义变量

let a = 1;
let a = 2;// 在同一个块级作用域中不能重复的定义变量

console.log(a);//Identifier 'a' has already been declared

let定义的变量没有预解析,不存在变量提升,在代码块中,只要let定义的变量,在之前调用,都是会报错的!先定义后使用!

let a = 12;
function func() {
    
    //只要在当前的块级作用域中通过let定义了变量,那么一定会使用这个变量
  console.log(a);//报错 原因没有预解析这么一说了
  let a = 2;
}
func();

let定义的变量只能在这个块级作用域中使用,外部是不能调用的

for (let i = 0; i < 10; i++) {
    
    
  console.log(i)//正常打印
}
// console.log(i)//报错:找不到i

if (true) {
    
    
  let a = 6;//通过let定义的变量只能在当前的代码块中调用
  console.log(a)//6
}
console.log(a)//报错找不到a

for循环,小括号中的是父级作用域而花括号中的是子集作用域

for (let i = 0; i < 3; i++) {
    
    //小括号中的是父级作用域而花括号中是子集作用域
  // console.log(i)//0/1/2;
  let i = 'xbc';
  console.log(i)//没有报错并且输出xbc/xbc/xbc
}

{
    
    //父级作用域父级作用域是访问不到子集作用域中的变量的
  let a = 12;
  {
    
    //子集作用域
    let a = 5;
    console.log('子集作用域:', a)//5
  }
  console.log('父级作用域:', a)//12
}

const定义常量的特点

const的特性和let是一样的不同的是const定义好了就不能改变了

const str = '字符串';
str = '修改字符串';
console.log(str);//Assignment to constant variable.

const定义完变量必须有值,不能先声明后赋值

const str;//Missing initializer in const declaration
str = '常量';
console.log(str);

通过const指定的只能是普通的,不能是引用机制的例如数组

const arr = ['apple', 'banana'];
arr.push('orange');//对象是引用机制,所以能修改缓存,要想实现彻底的常量可以用Object.freeze(对象)方法
console.log(arr);//["apple", "banana", "orange"]

const arr =Object.freeze(['apple,banana']);//冻住数组可以,但是也只能限制push/unshift/shift/pop等方法,如果数组里面放置的是对象,通过数组[index].key的方式修改,也是不行的
arr.push('orange');
console.log(arr)//Cannot add property 1, object is not extensible

猜你喜欢

转载自blog.csdn.net/big_sun_962464/article/details/113730873