js ES6中 let var const
var 和let
ES6 新增了let命令,用来声明局部变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效
与 var 相比,let 和 const 不存在变量提升。变量提升,指的是在变量声明之前就可以使用,只是,在声明之前,变量的值为undefined。var 声明的变量,在全局范围内都有效,而 let 声明的变量,只在 let 所在的作用域内有效。
首先来看var的变量提升:
var a = "你好!";
function fn(){
console.log(a); // 使用a
//首先查看函数内部有没有定义这个a 变量提升
if(false){
var a = "扣肉!";
}
}
fn(); //输出undefined
这里吧if语句中的var a提升到到了consol的前面,相当于在consol的前面 有着 var a 但没有对a进行赋值。
作用域提升 只是把定义 放在前面 赋值还是原来的位置
for(var i = 0; i < 10; i++) {
console.log(i)
}
console.log(i); // 10
es6为js新增了块级作用域
function fn() {
let a = 5;
if (true) {
//let a = "扣肉!";
console.log(a); //输出扣肉
}
console.log(a); //输出5
}
fn();
允许块作用域可以任意嵌套
{
{
let a = "1";
}
let a = "2";
console.log(a);
}
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);//输出1 ,2,3,4,...10;
};
//若讲let换成var 则i为全局变量输出的是10。
}
另外let不存在变量提升:
console.log(b); //
var b = 1;
var b;
console.log(b)
b = 1
console.log(c); //
let c = 2;
暂时性死区
只要块级作用域里面存在let声明 ,它所有声明的变量就会绑定这个区域 不再受外部影响
var a1 = "苹果";
if(true){
a1 = "小欧"; //这一行代码就是一个死区
let a1; // 变量的赋值 就是使用a1 ES6 规定必须要先声明 再去使用
}
console.log(a1);
另外let不能声明同样的变量名
{报错
let a = 1;
let a = 2;
}
var a = 0;
// ES5 全局的变量 是挂在 window下面
console.log(window.a);
let b = 1;
console.log(b);
{
console.log(b);
}
const
const定义的变量不可以修改,而且必须初始化
const b = 2;//正确
// const b;//错误,必须初始化
console.log('函数外const定义b:' + b);//有输出值
// b = 5;
// console.log('函数外修改const定义b:' + b);//无法输出