1、var声明
var声明的范围是函数作用域,使用var在一个函数内部定义变量,就意味着该变量将在函数退出时被销毁。如下所示:
function test() {
var age = 21;
}
test();
console.log(age); //出错!
在函数内部定义变量时省略var操作符,则会创建一个全局变量:
function test() {
age = 21;
}
test();
console.log(age); // 21
var声明的变量会自动提升到函数作用域顶部,如果在声明变量语句之前,使用该变量并不会报错:
function test() {
console.log(age);
var age = 21;
}
test(); // undefined
虽然未报错,但是由于该变量只是声明提升了,但是赋值初始化的操作并没有提升,所以输出undefined,上面那段代码等同于:
function test() {
var age;
console.log(age);
age = 21;
}
test(); // undefined
2、let声明
与var相比,有以下区别:
1、let声明的范围是块作用域。
2、let不允许同一个块中出现冗余声明。
3、let声明的变量不会在作用域中被提升。
4、使用let在全局作用域中声明的变量不会变为window对象的属性,使用var声明的变量则会。
let name='zs';
console.log(window.name); // undefined
var name_2='ls';
console.log(window.name); // 'ls'
3、const声明
与let的唯一一个重要区别就是:使用const声明变量时,必须同时初始化该变量,且不可修改该变量指向的引用(可以修改对象内部的属性)。
相同点:const也不允许重复声明、const声明的作用域也是块。
最佳声明风格:
1、不使用var
2、const优先,let次之(使用const声明可以让浏览器运行时,强制保持变量不变,也有助于发现一些意外赋值行为)