ES6新增了2种对象声明方式let和const,加上原来的var,总共3中声明关键字,另外js也接受没有声明关键字的方式。
1.变量的作用范围
首先,JS变量分为全局变量和局部变量,局部变量又分为块级别和函数级别。块级别就是由{ }组成的区域内以及for语句,函数级别就是变量声明最近一级的函数内。如果变量没有用以上3种关键字声明,那么默认为全局变量,如果其在函数内声明,那么函数必须先调用,然后才能使用这个变量,因为JS的执行过程是先注册函数,再注册变量,最后才执行语句,函数内的变量只有执行到后才会继续执行先注册再执行的过程,函数和对象的声明同样。
请看下面例子:
function f1(){
var n=999;
nAdd=function(){n+=1}
name = "Bob"
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000
console.log(name)
n是f1内局部变量,nAdd和name分别是未用关键字声明的全局函数对象和全局字符串,调用前必须先调用result,否则会报错。
2.var let const的区别
var可以声明全局变量和最近的函数内部局部变量,不支持块级。而let const除了全局和局部变量外还支持块级变量。const声明的对象必须要初始值,而且不能修改,但是如果是对象可以修改其属性。
<p id="demo"></p>
<script>
var i = 5;
for (let i = 0; i < 10; i++) {
// 一些代码...
}
document.getElementById("demo").innerHTML = i;
上例的执行结果为5,如果let改成var,那么结果为10。如果改成const,那么会报错,因为const声明的变量不能修改。
3.变量的重置
- 使用 var 关键字声明的变量在任何地方都可以继续用var重置修改
- let和const声明的变量都不能和它所在作用域内的其他变量或函数拥有相同的名称,所以无法在同级作用域内对let和const声明的变量重新声明,也无法对var声明过的变量重新用let和const声明
- var声明的对象可以先使用再声明,let和const声明的对象必须是先声明再使用
var x = 2; // 合法
let x = 3; // 不合法
{
var x = 4; // 合法
let x = 5 // 不合法
}
let x = 2; // 合法
let x = 3; // 不合法
{
let x = 4; // 合法
let x = 5; // 不合法
}
let x = 2; // 合法
var x = 3; // 不合法
{
let x = 4; // 合法
var x = 5; // 不合法
}
let x = 2; // 合法
{
let x = 3; // 合法
}
{
let x = 4; // 合法
}