var,let和const声明变量
var 声明
var声明作用域
function test() {
var message = "hi"; // 局部变量
}
test();
console.log(message); // 出错!
为什么会报错呢?
这里调用test()函数,会创建这个变量并给它赋值,但在调用之后变量随即被销毁
可以采用下面的方法
function test() {
message = "hi"; //全局变量
}
test();
console.log(message); // "hi"
var声明提升
解析器会先解析代码,然后把声明提升到最前面
使用var声明,变量会提升到最前面,如下面一段代码
console.log(a); //undefined
var a = 1;
console.log(a); //1
//以上代码解析器执行过程如下
var a;
console.log(a); //1
a = 1;
console.log(a); //1
例二
var food = "apple";
function ac() {
if (false) {
var food = "banana";
}
console.log(food);
}
ac(); //undefined
//把false替换成true 输入即为banana
let 声明
let声明作用域
let 和 var最主要的区别是,let声明的范围是块级作用域,而var声明的范围是函数作用域
//var声明
if(true){
var age = 18;
console.log(age); // 18
}
console.log(age); //18
//let声明
if(true) {
let age = 18;
console.log(age); //18
}
console.log(age); // ReferenceError: age 没有定义
这里,age变量的作用域仅限于该块的内部, 块级作用域是函数作用于的子集 ,而let声明的范围是块级作用域,无法在if块外部引用
不能重复声明
let和const 都不能在同一作用域中声明同一个变量 var可以
var name;
var name;//不报错
let age;
let age; // SyntaxError;标识符 age 已经声明过了
//const也是如此
注意重复声明是出现在同一个作用域中
const 声明
- const声明变量时必须初始化,且在后面修改const声明的变量会运行错误
- const声明对象可以修改对象的属性,但不能赋给对象一个新对象
暂存性死区
上述提到过 let和var的最重要的区别在于let声明的变量不会在作用域中被提升
console.log(age); //undefined
var age = 18;
//而let和const不会提升
console.log(name); //ReferenceError:age 没有定义
let name = 'WBT'
全局声明
var name = 'Matt';
console.log(window.name); // 'Matt'
let age = 26;
console.log(window.age); // undefined
使用let在全局作用域声明的变量不会成为window对象的属性