1.var关键字
- var声明作用域 使用 var 在一个函数内部定义一个变量,就意味着该变量将在函数退出时被销毁
function test() {
var message = 'chengxuyunxiaoshi';
}
test();
console.log(message) //出错
- var声明变量提升 所谓的“提升”(hoist),也就是把所有变量声明都拉到函数作用域的顶部
function foo() {
console.log(message);
var message = 'chengxuyuanxiaoshi';
}
foo() //undefined
提升后的代码如下:
function foo() {
var message;
console.log(message);
message = 'chengxuyuanxiaoshi';
}
foo() //undefined
- var可以多次声明同一个变量
function foo() {
var age = 16;
var age = 18;
var age = 20;
console.log(age);
}
foo() //20
4.全局声明
var在全局作用域中声明的变量会成为 window 对象的属性
var name = "chengxuyuanxiaoshi";
console.log(window.name); //chengxuyuanxiaoshi
2.let关键字
- let声明作用域 let 声明的范围是块作用域
if(true) {
let age = 20;
console.log(age); //20
}
console.log(age); //错误
2.let不能变量提升
let 声明的变量不会在作用域中被提升【暂时性死区】
console.log(age); //错误,age没有定义
let age = 20;
3.let出现冗余声明
let 也不允许同一个块作用域中出现冗余声明
let age;
var age; //错误,age已经声明过
4.全局声明
var在全局作用域中声明的变量不会成为 window 对象的属性
let name = "chengxuyuanxiaoshi";
console.log(window.name); //undefined
3.const关键字
const与let基本相同,唯一一个重要区别是,是用const声明变量时必须同时初始化变量,且 不能修改 const 声明的变量
const age = 20;
age = 21; //错误
4.声明风格及最佳实践
- 不使用 var,因为使用 let 和 const 有助于提升代码质量,此时的变量有了明确的作用域、声明位置,以及不变的值。
- const 优先,let 次之。发者可以推断某些变量的值永远不会变,同时也能迅速发现因意外赋值导致的非预期行为