1.var,const,let的区别
首先,必须明确let 与const是ES6 中为了修复var的缺陷引入的,那么var有什么缺陷呢?
var
1.var没有块级作用域
在JS函数中的var声明,其作用域是函数体的全部。
for(var i=0;i<10;i++){
var a = 'a';
}
console.log(a);
console.log(l);
2.循环内变量过度共享
for (var i = 0; i 3; i++) {
setTimeout(function () {
console.log(i)
}, 1000);
}
循环本身及三次 timeout 回调均共享唯一的变量 i
。当循环结束执行时,i的值为3。所以当第一个 timeout 执行时,调用的 i 当让也为 3 了。
因此,let与const就是来解决这些问题的。
let
必须声明 'use strict' 后才能使用let声明变量,否则浏览并不能显示结果
let声明的变量拥有块级作用域。
也就是说用let声明的变量的作用域只是外层块,而不是整个外层函数。let 声明仍然保留了提升特性,但不会盲目提升,在示例一中,通过将var替换为let可以快速修复问题,如果你处处使用let进行声明,就不会遇到类似的bug。let声明的全局变量不是全局对象的属性。
这就意味着,你不可以通过window.变量名的方式访问这些变量。它们只存在于一个不可见的块的作用域中,这个块理论上是Web页面中运行的所有JS代码的外层块。形如for (let x...)的循环在每次迭代时都为x创建新的绑定。
这是一个非常微妙的区别,拿示例二来说,如果一个for (let...)循环执行多次并且循环保持了一个闭包,那么每个闭包将捕捉一个循环变量的不同值作为副本,而不是所有闭包都捕捉循环变量的同一个值。所以示例二中,也以通过将var替换为let修复bug。这种情况适用于现有的三种循环方式:for-of、for-in、以及传统的用分号分隔的类C循环。用let重定义变量会抛出一个语法错误(SyntaxError)。
这个很好理解,用代码说话
let a = 'a';
let a = 'b';
const
作用:用来定义常量,不允许重复声明
还有一篇帖子可以看看:https://juejin.im/post/6844903704189992973
作者:麻辣小隔壁 链接:https://www.jianshu.com/p/4e9cd99ecbf5 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。