1. 是否存在变量提升
var 存在变量提升,let与const不存在变量提升。
console.log(foo); // undefined
var foo = 2;
console.log(bar); // 报错
let bar = 2;
// const 同理
复制代码
const 声明的是一个只读的常量。一旦声明,常量的值就不能改变。
const 实质上保证的并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值)值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(对象、数组)变量指向的是内存地址,保存的值只是一个实际数据的指针。const 只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是否可变,就完全不能控制了。
2. 是否允许重复声明
var 允许重复声明, let与const不允许重复声明
var a = 1;
var a = 3;
let a = 1;
let a = 3; // 报错
const 同 let
复制代码
3. 是否存在块级作用域
var 不存在块级作用域(只有函数作用域和全局作用域) let 与const 存在块级作用域
if (true) {
var test = true; // 使用 "var" 而不是 "let"
}
alert(test); // true
复制代码
if (true) {
let test = true; // 使用 "let"
}
alert(test); // Error: test is not defined
复制代码
对于循环也是这样的,var 声明的变量没有块级作用域也没有循环局部作用域
for (var i = 0; i < 10; i++) {
var one = 1;
// ...
}
alert(i); // 10,"i" 在循环结束后仍可见,它是一个全局变量
alert(one); // 1,"one" 在循环结束后仍可见,它是一个全局变量
复制代码
如果一个代码位于函数内部,那么var 声明的变量作用域将为函数作用域
function sayHi() {
if(true) {
var phrase = 'hello';
}
alert(phrase) // hello
}
sayHi();
alert(phrase) // phrase is not defined
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END