在 const & let 还未出现前,JS 的世界一直是 var的统治
var:在JS中用于变量声明的关键字。浏览器
特色:闭包
…….函数
变量提高this
function test(tag) { console.log(a,b); // a,b在下面声明,可是会打印出undefined,不会报错 if(10 >= tag) { var a = tag + 1; } else { var b = tag - 1; } }
在浏览器预解析机制中,加载函数的时候,此时的做用域为函数做用域,函数做用域中JS会先将全部的声明置顶。code
function test(tag) { var a,b; // 将声明置顶,可是赋值并不会 console.log(a,b); // a,b在下面声明,可是会打印出undefined,不会报错 if(10 >= tag) { var a = tag + 1; } else { var b = tag - 1; } }
只有函数做用域以及全局做用域,没有块级做用域作用域
function test(tag) { console.log(a,b); // a,b在下面声明,可是会打印出undefined,不会报错 if(10 >= tag) { var a = tag + 1; } else { var b = tag - 1; } console.log(a); // 9 } test(8) // 9
按照其余语言规则 if 是一个程序块,在 if 中声明的变量做用域只能在 if 中,可是 JS 由于只有函数做用域和全局做用域,因此才会致使在 if 判断外还能够访问 if 的变量io
重复声明变量console
var a = 1; var a = 2; console.log(a); // 2
在使用var的时候容许重复声明变量也是使人头痛的事情,也许由于这个机制,可能就会出现bugfunction
循环体重的闭包会出现问题class
var arr = []; for(var i = 0; i < 3; i++) { arr.push(function () { return i; }) } for(var j = 0; j < 3; j++) { console.log(arr[j]()); // 3,3,3 } 将var -> let 将会打印出 0,1,2
由于缺少块做用域因此致使问题出现
现在距离ES6规范的出现已通过去了4年多了,在项目中也早已开始大量使用ES6规范编写代码了。var也再也不是JS世界的惟一了,
JS 世界出现了const & let。
const & let 的出现给JS带来了块级做用域,解决了变量提高,禁止了重复声明变量,让JS少了不少疑惑的地方。
相同点:
区别:
let
使用let声明的基本类型变量是能够改变值
let a = 12; a = 13; return a; // 13
使用let声明引用类型的变量是能够改变引用的
let info = { name: "ming995", age: 25, sayHi: function() { console.log(`Hi I'm ${this.name}`) } }; let heInfo = {}; heInfo = info; heInfo.name = "Jack"; console.log(heInfo);
const
使用const声明的基本类型变量是不能够改变值
const a = 13; a = 14; return a; // 报错
使用const声明引用类型的变量是不能够改变引用的
const info = { name: "ming995", age: 25, sayHi: function() { console.log(`Hi I'm ${this.name}`) } }; const heInfo = {}; heInfo = info; // 报错 heInfo.name = "Jack"; console.log(heInfo);
可是咱们能够操做const声明的引用类型的属性值
const info = { name: "ming995", age: 25, sayHi: function() { console.log(`Hi I'm ${this.name}`) } }; info.language = "js"; console.log(info);
以前对于const的理解有误差,因此就写这篇文章。var时代已通过去了,ES6各类特性用起来。