1、变量
变量 是数据的“命名存储”。我们可以使用变量来保存商品、访客和其他信息。
var
全局变量 如:
var a = 2
window.a=2
let
局部变量声明, 只在区块内起作用,外部是不可以调用的。有三个特点:
- 不存在变量提升
var命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined。这种现象多多少少是有些奇怪的,按照一般的逻辑,变量应该在声明语句之后才可以使用。为了纠正这种现象,let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。
- 暂时性死区
只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
- 不允许重复声明
let不允许在相同作用域内,重复声明同一个变量。
const
声明一个只读的常量。一旦声明,常量的值就不能改变。(只在声明所在的块级作用域内有效。)
不存在常量提升, 同样存在暂时性死区, 只能在声明的位置后面使用。
本质:const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。
const foo = {};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only
变量总结:
var
- 支持全局、函数作用域
- 接受重复声明
- 变量预解析
let
- 不接受重复声明
- 不存在变量提升
- 支持块作用域
const
- 特性同let
- 一旦声明,常量的值就不可以改变
测试题:
1、最终a输出的值是多少
var a = 1;
{
let a = 10;
}
console.log(a)
2、fn()最终n输出的值是多少
function fn() {
let n = 5;
if (true) {
let n = 10;
}
console.log(n);
}
fn()
3、最终f()输出是多少
var tmp = new Date();
function f() {
console.log(tmp);
if (false) {
var tmp = 'hello world';
}
}
f();