js中的变量

141 阅读2分钟

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用自执行函数也是一样的结论