在ES6语法中,let 和 const 是新的变量定义方法,其中const用于定义常量。
块级作用域在ES6之前只有全局作用域和函数作用域。如下
var fn1 = function(){
var num = 5;
}
fn1();
console.log(num); // 报错:num未定义
var fn2 = function(){
num = 5;
}
fn2();
console.log(num); // 5
函数体内部会形成一个函数作用域,在没有任何作用域延伸的处理时,外层无法访问该变量。但是在执行 glo 函数时,num未声明,自动声明为全局变量,作用域为全局作用域,所以可以输出 num 为 5。
使用 let 形成块级作用域通常可以在大括号 {...}里使用, 外层作用域无法读取内层作用域的内容。
'use strict';
function foo (){
if(true){
let i = 0;
console.log(i);
}
console.log(i); // 不能读取 if 里面的 i
}
foo(); // 0 报错:i 未定义
let定义变量
let 定义的变量的的作用域限定在块级,但是使用 var 定义的变量不存在块级作用域,比如将上面代码中的 let 换成 var
'use strict';
function foo (){
if(true){
var i = 0;
console.log(i);
}
console.log(i);
}
foo(); // 0 0
在 for 循环中,使用var定义的循环变量 i 存在于 for 循环的上层作用域中,这对于我们编程可能会带来一定的困扰。
var arr = [1,2,3,4,5];
var sum = 0;
for(var i = 0;i < arr.length;i++){
sum += arr[i];
}
// for 循环外依然可以获取到 i 的值
console.log(i); // 5
使用 let 定义循环变量就完美的避开了这个问题
var arr = [1,2,3,4,5];
var sum = 0;
for(let i = 0;i < arr.length;i++){
sum += arr[i];
}
// let 只能作用于循环内部
console.log(i); // 报错:i 未定义
注意:同一作用域下, 不可使用 let 重复声明变量。
const定义常量使用 const 定义常量,声明后必须要赋值,否则会报错
//定义一个常量
const age = 20;
//该常量不能重新赋值
age = 25; // 报错:不能赋值给常量
于 let 相同,const 的作用域也限定在块级,而且不可重复声明
var fn = function(){
if(true){
const name = "小明";
console.log(name); // 小明
}
console.log(name); // 不报错但是没输出
}
fn();
const 定义常量的原理是阻隔变量名所对应的内存地址被改变。所以定义的值在某些情况下也不是不可变
const myArr = [0,1,2];
console.log(myArr); // [ 0,1,2]
myArr.push(3);
console.log(myArr); // [0,1,2,3]
想要获得一个值不可变的对象就要用到 Object.freeze() 方法了
const myArr = Object.freeze([0,1,2]);
myArr.push(3); // 这里就会报错啦
如果哪里写错了,希望大家批评指正