let and const

很多时候我们因为对未知的恐惧,放弃了很多,但是如果勇敢的迈出那步,可能会发现,被你所恐惧的未知,也许时美好的。

先讲一个悲伤的故事

未来var 可能将会被 let 替代了,说实在的,大学学的是计算机,但是大学四年写的代码了了无几,那时候对写代码正的很害怕,为什么呢?因为不明白,为什么不明白呢?因为懒,很多计算机最基础的东西自己都没看,每天听老师讲的云里雾里,印象最深的是,大一学C语言,涉及到命名空间这样的概念,不明白,大一上完了,也不明白为什么要有命名空间。

为什么要有命名空间,当你在写css的时候给类命名的时候,或许你会有一丝的感悟,所有既定的方案一定都是为了解决某个蛋疼的问题而出现的。

let 和 const 的出现,一定的程度上解决了很多的问题,也在向一个健全的语言迈出坚实的一步,ES6的出现都是为了弥补其匆匆出生,而带来的一些先天性的不足。

但仔细想想,我确是因为js可以先使用后声明而喜欢上它的,虽然我现在已经不这么干了,js被称为玩具语言,是否也说明其可玩性在一大波的编程语言中的可玩性比较的高。

如果js继续使用var会发生的事

其实也不是继续使用,原来就会发生的,而这些问题很多的时候会出现在你的面试题中,先看下面的一段代码:

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

面对这样的事,很难解释,for循环中使用了var,这回在for所在的代码执行的环境中增加一个变量,是的这个i它越狱了,可能在不经意见导致了变量污染。

那么上面的这段代码可以理解为这样:

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

那么你应该就不难理解这段2段代码了:

for(var i = 0; i < 5; i++){
  setTimeout(function(){
      console.log(i)
  }, 1000)
}
for(var i = 0; i < 5; i++){
      console.log(i)
}

第一段代码console.log(i);这段代等待了1秒钟,可它不知道的是,在这一秒中的时间内,很多事情发生了变化,i已不是1秒前的那个i,"怀旧空吟闻笛赋 到乡翻似烂柯人"。

let 和 const的降临

let的出现带来了块级作用域,在下面的这段代码中:

for(let i = 0; i < 5; i++){
  setTimeout(function(){
      console.log(i)
  }, 1000)
}

你会看到输出如你所愿,至于为什么会这样,可以先参考以下以下的代码:

for(let i = 0; i < 5; i++){
  let i = 8
  console.log(i)
}

可以理解为在for循环中是有2个作用域的,一个是在小括号当中,一个是在大括号当中,小括号中的i是会变的,但是对于大括号而言,每次执行代码,因为小括号中的i在变化,所已传入的参数在变化,每次执行大括号的中的代码的时候,是在一个新的作用域中进行执行的,每个新的作用域中的i都不同,而不是像之前那样公用的父级作用域中的i。

为了标题而写的const

const 其实在我目前的代码中应用的已经很多了,主要是声明一些不会改变的常量,一些项目中用到的配置参数也是用const进行声明的,需要注意的是: const 、let 声明后需赋值; const 声明的值不可修改; 都不存在变量提升(不能先上船后补票了); 都不存在重复赋值;

最后更新于