通过var定义的变量,作用域是整个封闭函数,是全域的 。通过let定义的变量,作用域是在块级或是子块中。
<script>
console.log(fun); //undefined
var fun=2;
console.log(fun); //2
var fun=45; //不会报错
let fun=46;//会报错
</script>
变量提升现象: 浏览器在运行代码之前会进行预解析,首先解析函数声明,定义变量,解析完之后再对函数、变量进行运行、赋值等。
-不论var声明的变量处于当前作用域的第几行,都会提升到作用域的头部。
-var 声明的变量会被提升到作用域的顶部并初始化为undefined,而let声明的变量在作用域的顶部未被初始化
<script>
for (var i = 0; i < 5; i++) {
}
console.log(i);//5
for (let j = 0; j <5 ; j++) {
}
console.log(j);//Uncaught ReferenceError: i is not defined
</script>
let关键字
let关键字用来声明变量,使用let声明的变量有几个特点:
1)不允许重复声明
2)块儿级作用域
3)不存在变量提升
4)不影响作用域链
应用场景:以后声明变量使用let就对了
<script>
//声明变量
let a;
let b,c,d;
let e = 100;
let f = 521, g = 'iloveyou', h = [];
//变量不能重复声明
let star = '罗志祥';
let star = '小猪';
// if else while for
{
let girl = '周扬青';//girl is not defined
}
console.log(girl);
//不存在变量提升
console.log(song);// Cannot access 'song' before initialization
let song = '恋爱达人';
//不影响作用域链
{
let school = '尚硅谷';
function fn(){
console.log(school);
}
fn();
}
</script>
2.2.const 关键字
const关键字用来声明常量,const声明有以下特点
1)声明必须赋初始值
2)标识符一般为大写
3)不允许重复声明
4)值不允许修改
5)块儿级作用域
注意:对象属性修改和数组元素变化不会出发const错误
应用场景:声明对象类型使用const,非对象类型声明选择let
//声明常量
const SCHOOL = '尚硅谷';
//1. 一定要赋初始值
const A;
//2. 一般常量使用大写(潜规则)
const a = 100;
//3. 常量的值不能修改
SCHOOL = 'ATGUIGU';
//4. 块儿级作用域
{
const PLAYER = 'UZI';
}
console.log(PLAYER);//PLAYER is not defined
//5. 对于数组和对象的元素修改, 不算做对常量的修改, 不会报错
const TEAM = ['UZI','MXLG','Ming','Letme'];
TEAM.push('Meiko');