ES6语法篇(1)——let和const
let命令
(1)let声明变量,只在let命令所在的代码块里有效,没有变量提升,变量提升就是在声明变量之前使用该变量,其值为undefined,而let声明变量只能在变量声明之后使用。
(2)ES6明确规定,如果在块级作用域内存在let和const命令,这个区块对这些声明的变量从一开始就形成了封闭区域,凡是在声明之前使用这些变量就会报错。
(3)不允许重复声明变量。
(4)块级作用域。ES6只有函数作用域和全局作用域,而let为JavaScript添加了块级作用域:
function f1(){ let n = 5; if ("1") { let n = 10; } console.log(n) } f1(); // n=5
外层代码块不受内层代码块的影响。
(5)ES5规定只能在函数声明只能在函数作用域和全局作用域,ES6引入了块级作用域,并且规定可以在块级作用域内声明函数。而且在块级作用域内声明的函数类似于let,在块级作用域外面不可引用:
function f() {console.log("i am in outside")};
(function(){
if (false){
function f(){
console.log("i am in inside");
}
}
f(); // Uncaught TypeError: f is not a function
}())
以上代码会在符合ES6的浏览器中报错,阮一峰大佬建议在块级作用域中使用函数表达式,取代函数声明。
const命令
const声明一个只读的常量,一旦声明就无法更改。而且声明的同时,就得立即初始化,不然就会报错。在其他地方,const与let用法完全一样。
const实际上保证的是变量指向的内存地址不得改动。对于简单的数据类型,值就保存在变量指向的内存地址,等同于常量。对于对象和数组,变量指向的内存地址,保存的是一个指针,const保证的是这个指针是固定的,而指针指向的数据结构就不能控制了。也就是说,const声明对象和数组,对象与数组的值均是可以更改的。