1、const定义的变量不可以修改,而且必须初始化
const b = 2;//正确
// const b;//错误,必须初始化
console.log('函数外const定义b:' + b);//有输出值
// b = 5;
// console.log('函数外修改const定义b:' + b);//无法输出
1、const声明的变量,只在声明所在块级作用域有效;
2、const声明的常量不会变量提升,只能在声明后使用;
3、不可重复声明;
2、var定义的变量可以修改,如果不初始化会输出undefined,不会报错
var a = 1;
// var a;//不会报错
console.log('函数外var定义a:' + a);//可以输出a=1
function change(){
a = 4;
console.log('函数内var定义a:' + a);//可以输出a=4
}
change();
console.log('函数调用后var定义a为函数内部修改值:' + a);//可以输出a=4
3、let是块级作用域,函数内部使用let定义后,对函数外部无影响
(1)基本用法
//demo1
// 如果将let声明的变量包含在{}之中,则该变量只在此代码块内有效
let a = 10;
var b = 12;
console.log(a); //10
console.log(b); //12
//demo2
var a = [];
for(var i=0; i<10; i++){
// i是var声明的,全局范围内有效,所以每一次循环,i的值都会发生改变
a[i] = function(){
console.log(i);
}
}
// 函数内部的i指向全局,所以数组中的i指向的都是最后一轮i的值
a[6](); //10
//demmo3
var a = [];
for(let i=0; i<10; i++){
// i是let声明的,只在本轮循环内有效,每一次循环都是一个新变量
a[i] = function(){
console.log(i);
}
}
a[6](); //6
(2)不存在变量提升
使用let声明变量,只要变量在未声明前使用,都会报错,不会提前声明变量
(3)暂时性死区
//demo1
var temp = 12;
// 一个不存在的变量用typeof检查,返回的是undefined
console.log(typeof b); //undefined
if(true){
// 只要块级作用域内存在let和const声明的变量,就会在一开始形成封闭作用域,不再受外部变量干扰
temp = "123"; //报错
// 用typeof检查let声明的变量,会报错
console.log(typeof temp); //报错
let temp;
}
//demo2
function demo1(a = 2 , b = a){
return console.log(a + ',' + b);
}
// 将y赋值给x前,y还没有声明,属于死区
function demo2(x = y , y = 2){
return console.log(x + ',' + y);
}
demo1();
demo2();
//demo3
var x = x; //不报错,x声明提升。
// 使用let声明变量时,只要变量在未声明前使用,都会报错
let y = y; //报错
(4)不允许重复声明
不能在函数内部重新声明参数
//demo1
function (){
// 报错
let a = 10;var a = 2;
// 报错
var a = 10;let a = 2;
// 报错
let a = 10;let a = 2;
// 报错
var a = 10;var a = 2;
}
//demo2
function fun(a,b){
// let a; //报错
{
let b; //不报错
}
}