let和const均为ES6中声明变量的方法,用法相似于var,可是其所声明的变量,只在let命令所在的代码块内有效
<!-- more -->git
其所声明的变量,必须先声明再使用,若先使用,后声明则会报错github
即在存在let的块级做用域,造成了一个封闭的环境,在这其中,若先使用后声明则仍旧会报错浏览器
以下:ide
{ console.log(temp);//暂时性死区,会报错 let temp //死区结束 }
有些隐蔽的死区以下:函数
function foo(x=y,y=2){ return [x,y] } foo() //报错
该报错是由于在y尚未声明的时候就使用了(将y赋值给x),此时就会报错指针
在同一个做用域中,不能重复声明同一个变量code
function a(){ let a = 5; var a = 5; } function b(){ let a = 5; let a = 5; }
这二者都会报错对象
let和const实际上提供了一种块级做用域
ES6容许块级做用域随意嵌套
外层做用域没法读取内层做用域的变量,内层做用域的变量可覆盖外层做用域的变量ip
function f() { console.log('I am outside!'); } (function () { if (false) { // 重复声明一次函数f function f() { console.log('I am inside!'); } } f(); }());
ES6中,理论上该函数运行会获得I am outside
,由于外层的做用域没法访问内层变量,但内层做用域的变量可访问外层变量.
在因为兼容性问题,在浏览器中,块级做用域声明的函数,行为相似于var声明的变量内存
note:考虑到兼容性问题,应该避免在块级做用域中声明函数,或者声明时利用函数表达式的形式声明:
// 函数声明语句 { let a = 'secret'; function f() { return a; } } // 函数表达式 { let a = 'secret'; let f = function () { return a; }; }
note: ES6 的块级做用域容许声明函数的规则,只在使用大括号的状况下成立,若是没有使用大括号,就会报错
const声明的变量即常量,即声明后没法改变该变量的值,因此const声明变量时候必须进行初始化,若不声明,则会报错
const与let相似:只在声明所在的块级做用域内有效,不存在变量提高,一样存在暂时性死区,只能在声明的位置后边使用
const的声明变量的值不变是针对于变量指向的内存地址不变,
对于值类型的变量类型来讲,则值不能变,
但对于引用类型的变量类型来讲,则该变量所指向的内存地址不变,即指向对象的指针不变,但对象的内容是能够变的,
const foo = {}; // 为 foo 添加一个属性,能够成功 foo.prop = 123; foo.prop // 123 // 将 foo 指向另外一个对象,就会报错 foo = {}; // TypeError: "foo" is read-only
const foo = {}; // 为 foo 添加一个属性,能够成功 foo.prop = 123; foo.prop // 123 // 将 foo 指向另外一个对象,就会报错 foo = {}; // TypeError: "foo" is read-only
ES6声明变量的六种方法var function let const import class