let和const命令

es是标准,js是实现 es6是JavaScript语言的下一代标准

let 声明的变量是区块变量。

*代码块内有效
let 只在 let 命令所在的代码块内有效,var 是在全局范围内有效
*不能重复声明
let 只能声明一次 var 可以声明多次
*不存在变量提升
let 不存在变量提升,var 会变量提升

for (var i = 0; i < 10; i++) {
  setTimeout(function(){
    console.log(i);
  })
}
// 输出十个 10
//原因:setTimeout是一个宏任务,它在事件队列里排在了script标签这个宏任务的后面。
//浏览器会先执行第一个宏任务,也就是读取script标签中的代码,遇到setTimeout时,
//将其放进事件队列中等待执行,循环10次,也就是事件队列中放了10个setTimeout,
//这时第一个事件执行完毕,再执行下一个宏任务,也就是依次执行setTimeout,
//这时i已经变成了10,所以会打印出十个10;

for (let j = 0; j < 10; j++) {
  setTimeout(function(){
    console.log(j);
  })
}
// 输出 0123456789
//原因:因为let  i  的是区块变量,每个i只能存活到大括号结束,
//并不会把后面的for循环的  i  值赋给前面的setTimeout中的i;
//而var i  则是局部变量,这个 i 的生命周期不受for循环的大括号限制

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

  • const 其实保证的不是变量的值不变,而是保证变量指向的内存地址所保存的数据不允许改动,也就是指针是固定的,但是指向的内容无法控制。
    就像是抽屉的钥匙,明确指向是哪个抽屉,但是抽屉里面可以放不同的东西。
  • 使用 const 声明复杂类型对象时要慎重
    对于简单类型(数值 number、字符串 string 、布尔值 boolean),指向的那个内存地址,因此 const 声明的简单类型变量等同于常量。
    对于复杂类型(对象 object,数组 array,函数 function),变量指向的内存地址其实是保存了一个指向实际数据的指针
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容