var 声明用法
var 是声明变量的关键字,变量名称最好含义明确,以字母或者下划线开始或者$,跟上数字字母下划线,不能用特殊符号,比如我要声明一个“name”为“livall“ 的变量,则可以这样写
var name = “livall”;
var 变量声明的特点
1.变量提升,意思是说可以先用后声明,程序不会崩溃,举个例子:
console.log(name);varname="livall";
2.其作用域为该语句所在的函数内
function getName(){
var myName = 'livall';
console.log(myName)
}
getName()
console.log(myName)
直接在 getName()函数外console.log(myName)会报错,var myName 只会在函数getName()内起作用。
let 声明的用法
let 和const 是ES6 新增的两个关键字,let 的用法类似于var, 但是所声明的变量,只在let命令所在的代码块内有效。
基本用法
{
let a = 0;
console.log(a) // 0
}
console.log(a) // 报错 ReferenceError: a is not defined
上面代码在代码块之中,用let声明了变量a。然后在代码块之外调用这个变量,结果报错,这表明,let声明的变量只在它所在的代码块有效。所以对于for循环就很适合,比如下面这个例子
for (var i = 0; i < 10; i++) {
console.log(i)
}
原本你是想打印0到9的,但是你会发现最后输出的全是10;
如果你用let 就不一样了,会得到你想要的结果。
不存在变量提升
console.log(a); //ReferenceError: a is not defined
let a = "livall";
变量 a 用 let 声明不存在变量提升,在声明变量 a 之前,a 不存在,所以会报错。
暂时性死区 (temporal dead zone,简称 TDZ)
ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
if (true) {
// TDZ开始
name = 'livall'; // ReferenceError
console.log(name); // ReferenceError
let name ; // TDZ结束
console.log(name ); // undefined
name = livall;
console.log(name ); // livall
}
“暂时性死区”也意味着typeof不再是一个百分之百安全的操作。
typeof x; // ReferenceError
let x;
ES6 规定暂时性死区和let、const语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在 ES5 是很常见的,现在有了这种规定,避免此类错误就很容易了。
总之,暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
不允许重复声明
let不允许在相同作用域内,重复声明同一个变量。
// 报错
function func() {
let a = 10;
let a = 1;
}
const 声明的用法
基本用法
const 声明一个只读变量,声明之后不允许改变。意味着,一旦声明必须初始化,否则会报错。
const name = “livall”
暂时性死区
if(true){
console.log(name); // ReferenceError: name is not defined
const name = "livall";
}
ES6 明确规定,代码块内如果存在 let 或者 const,代码块会对这些命令声明的变量从块的开始就形成一个封闭作用域。代码块内,在声明变量 PI 之前使用它会报错。