一.let命令
- 变量提升:var声明的变量无论其实际声明位置在何处,都会被是为声明于所在函数(或全局)的顶部
- for(let i=0;i<3;i++){let i=‘abc’;console.log(i);}
for循环在设置循环变量的部分是一个父作用域,循环体内部又是一个独立的子作用域。就近原则。
- 暂时性死区:如果区块中存在let和const命令,则这个区块对这些命令声明的变量从一开始就形成封闭作用域,在代码块内,使用let命令声明变量之前,该变量都是不可用的
- Let不允许重复声明。Eg:functionfn(){let a=10;let a=1;} functionfn(){let a=10;var a=1;} functionfn(){var a=10;let a=1;}都是错的。
- JavaScript采0用的是“词法作用域”,即在变量作用域取决于变量所在的代码区域。
- 作用域:
全局作用域
在所有函数之外定义的变量拥有全局作用域,该变量为全局变量。
全局变量可以在当前页面中任何JavaScript代码中访问。
函数作用域
在函数中声明的变量(包括函数参数)指定在其所声明的函数内被访问。
块作用域
由{ }界定的代码区域,let声明的变量具备可访问块作用域
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var v1=100;
function f1(){
// console.log(v1,v2);
var v1=110;
let v2=200;
function f2(){
let v3=300;
console.log(v1,v2,v3);
}
f2();
console.log(v1,v2,v3);
}
f1();
console.log(v1,v2,v3);
</script>
</body>
</html>
二.Const命令
1.基本用法:声明一个只读的常量,一旦声明,其值不能改变且必须立即初始化。,除此外与let一致。
2.本质:当常量保存的不是一个值,而是一个地址的时候,该常量所引用的对象是可以更改成员的,只是不能更改该常量保存的地址
三.小结
• 1. 由于let和const能提供更好的作用域识别,建议尽量采用let声明变量,const声明常量。