变量声明关键字var、let、const
举例
var a = 10;直接声明赋值
var a;
a=10;先声明后使用b = 10;
var b;//先试用后定义,声明会提升到作用于最前面c = 10;//直接赋值,直接变为顶层对象的属性,在node中顶层对象为global
let a = 10;//有块作用域限制,不能重复声明,声明不会自动提升。
const a = 10;//可以用来声明常量,指向的是基本类型则类似常量,指向对象则类似常指针。和let一样也有块级别作用域。
注意事项
1.var 这种定义可以重复定义,不会报错
var a=10;
var a = {};
这样的定义也会存在被覆盖的问题
var a = 10;
for( var a = 2; a > 0; a-- ){
console.log(a)
}
//循环后a的值为0
var a = 10;
{
var a = 20;
}
console.log(a);
//输入结果为20
2.let不允许重复声明变量包括之前用var声明过的。
var a = 10;
let a;//报错
let b;
let b;//报错
因为let有块级别作用域,所以不会像var被覆盖。
let a = 10;
for( let a = 1; a < 2; a++){
console.log(a);
}
console.log(a);//a=10
let b = 10;
{
let b = 20;
}
console.log(b);//b=10;
但是使用let需要注意,let声明的变量不会自动提升,在let的作用域内未定义先使用会出ReferenceError
{
d = 10;
let d; //报错,d没有定义
}
在没有let的代码中使用typeof a,如果a是未定义的则表达式会返回undefined,但是如果是使用了let的代码块中,typeof a,a未定义则会抛出ReferenceError,即使块之外已经定义了a。
3.const和let类似,只不过const定义的是常量,声明时赋值,声明时不赋值会产生语法错误。Const声明的变量只是变量本身是只读的。
可以使用const foo = Object.freeze({});方式把对象变为只读。
特别指出:
* 允许在块级作用域内声明函数。
* 函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
* 同时,函数声明还会提升到所在的块级作用域的头部。
注意,上面三条规则只对ES6的浏览器实现有效,其他环境的实现不用遵守,还是将块级作用域的函数声明当作let处理。
考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。如let func = function(){}这种形式。