let var const声明变量区别
let (块级作用域)
1、let所声明的变量只在let命令所在的代码块内有效。(块级作用域)
非常适合在循环中使用
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
2、let命令不存在变量提升 它所声明的变量一定要在声明后使用,否则报错。
3、let声明变量存在暂时性死区
全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错
在代码块内,使用let命令声明变量之前,该变量都是不可用的
const(常量)
一旦声明,常量的值就不能改变。const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。
const PI = 3.1415;
PI // 3.1415
PI = 3;
// 报错
const foo;
// 报错
只在声明所在的块级作用域内有效。
var(变量)
支持变量提升
接使用没有声明的变量,let直接报错,var的提示未定义:undefined
console.log(varTest); //输出undefined(注意要注释掉下面一行才能运行)
console.log(letTest); //直接报错:ReferenceError: letTest is not defined
var varTest;
let letTest;
console.log(varTest); //输出undefined
console.log(letTest); //输出undefined
//重复声明同一个变量的时候,不同
var varTest = 'test var OK.';
let letTest = 'test let OK.';
var varTest = 'varTest changed.';
let letTest = 'letTest changed.'; //直接报错:SyntaxError: Identifier 'letTest' has already been declared
console.log(varTest); //输出varTest changed.(注意要注释掉上面letTest变量的重复声明才能运行)
console.log(letTest);
//变量作用域不同
{
var varTest = 'test var OK.';
let letTest = 'test let OK.';
{
var varTest = 'varTest changed.';
let letTest = 'letTest changed.';
}
console.log(varTest); //输出"varTest changed.",内部"{}"中声明的varTest变量覆盖外部的letTest声明,覆盖
console.log(letTest); //输出"test let OK.",内部"{}"中声明的letTest和外部的letTest不是同一个变量,let块级作用域
}