在JavaScript里,变量创建可以用字面量形式和通过构造函数创建这两种形式创建变量。var和let可以声明变量,const可以声明常量,对象也是变量。
- var与let声明变量的区别
1.var与let在全局作用域下声明的都是全局变量,可以重新赋值,但通过let声明的变量不可以重复声明
let a = 1;
let a = 2; // *不可以重复声明该变量*
2.ES6新增的let关键字让你在块级作用域下声明的变量只在该块级作用域下有效。可以利用这一点可以避免变量名冲突,在函数中最好用let声明变量。
ho();
function ho(){
let a = 1; // *在函数作用域下有效*
if(true){
let a = 2; // *在if块级作用域有效*
console.log(a); // 2
}
console.log(a); // 1
}
- var存在变量提升,let和const不存在变量提升
JavaScript的语法解析时会把通过关键字声明的变量提升到当前作用域里代码的最前面,然后在该变量赋值之前使用该变量的值是undefined,let和const声明的变量赋值之前不能使用它。
console.log(a); // undefined
console.log(b); // ReferenceError: Cannot access 'b' before
console.log(c); // ReferenceError: Cannot access 'c' before
var a = 1;
let b = 1;
const c = 1;
- const常量不能修改。及不能重新赋值和声明
const a = 1; // 定义常量a,给a赋值为1
a = 2; // 报错(不能够重新赋值)
const a = 2; // 报错(不能够重新声明)
- 变量名与函数名(普通函数)和对象函数重名
1.当变量名和函数名重名时,变量生效
JavaScript的预编译,变量提升,函数声明会比变量提升更早,声明了的变量不会重复声明只是重新赋值。
// function a(){}; 函数提升
// var a; 变量提升
var a = 1;
function a(){} // 该函数被提到该作用域最上面
console.log(a); // 1
2.对象函数,相当于变量重新赋值
// var a; 变量提升
var a = 1;
var a = function(){} // 重新赋值
console.log(a); // function(){}
3.在全局作用域window下函数里的作用域this指向window(非严格模式),通过this.函数名声明变量,变量重新赋值,函数被覆盖。
function ho(){
this.ho = 1; // this指向window,window.ho重新赋值为1
console.log(ho);// window.a为1,但该函数作用域仍然有效
var a = 1; // 函数作用域声明的为局部变量
}
console.log(ho); // 输出ho的函数体及声明
ho() // 函数ho调用执行
console.log(ho); // 全局window下的ho变量,被重新赋值为1
console.log(a); // a是局部变量,在全局作用域下不生效
总结:var与let声明变量,const用来声明常量。var声明的变量存在变量提升且可以重复声明和重新赋值;let变量没有变量提升且不可以重复声明但可以重新赋值;const常量既不可以重复声明也不可以重新赋值。