1. 如果用var声明的全局变量,会被挂载在window对象上面, 而用delete是删除不掉的. 但是不加var 声明的变量可以删掉
a = 'come on'
delete window.a // true
var a = 'lisi'
delete window.a // false
2. 下面这个栗子说明
function test(a) {
console.log(a);
// f a(){} 打印输出的的是内部变量而不是456, 说明了在作用域内本地变量优先,覆盖全局变量。
// 打印输出的的是函数而不是内部变量1, 说明了变量提升, 函数声明的优先级比变量高
var a = 1;
console.log(a); // 1
function a() {
console.log(123);
}
console.log(a); // 1
}
test(456);
var let const 三兄弟区别
1.变量提升
var存在变量声明提升,let和const不会变量声明提升,所以let和const一定要先声明再使用,否则报错
2.作用域
var是局部作用于也叫做函数作用域,let和const是块级作用域
3.重复声明
因为var存在变量声明提升,所以重复声明之后,后面的覆盖前面的,不会报错。但是let和const在同一作用域里重复声明会报错
4.初始化
var和let可以声明的时候先不初始化,在非严格模式下不会报错,为undefined,但是const必须声明时同时初始化
5.初始化后是否可以修改
const初始化之后不可以修改,let和var初始化之后也可以修改。(但是const指向的是个引用类型的时候,可以修改引用类型内部)
用var 和不用 var声明的变量
用var声明的变量取决于当前所处的作用域, 可能是全局作用域也可能是函数作用域
而不用var声明的变量就是全局作用域
function fn() {
var c ='test';
console.log(c); // test
}
fn()
console.log(c); // c is not defined
function fn() {
d ='test';
console.log(d); // test
}
fn()
console.log(d); // test用自执行函数也是一样的结论