先看代码块
a = 1 //隐式声明
var a = 1
// 上面两种声明方法是ES 3的内容,下面的是ES 6 新增的声明变量方法
let a = 1
const a = 1
隐式声明
隐式声明是一种全局变量的声明方式,但是有一点需要注意的是,假如函数块中存在能访问的变量 a
,同时又隐式声明了 a = 1
那么这个隐式声明则会变成一个赋值的作用。
因此建议不要使用隐式声明声明变量。
var
声明
var 声明有一个非常大的弊端,就是在JS解析过程中 var 一定会被提前,这就导致了当不希望暴露一个全局变量的时候却不得不被暴露
function fn(){
if(true){
console.log(a)
}_else{
var a = 1
console.log(a)
}
}
上面的代码按道理来说是应该是报错,因为没有声明a,但是由于 var 会被提前,所以 在执行 console.log(a)
前就已经声明了 a 变量,不过没有被赋值,所以结果出现的是 undefined
ES6前,为了实现不暴露变量的目的,我们通常会采用函数自调用的方法
(function(){
var a = 1
window.clgA = function(){
console.log(a)
}
})() //这种方式我们就可以暴露一个全局变量 clgA 但是不暴露变量 a
let
声明
为了解决var
的弊端,方便使用局部变量,let
应运而生,通过一对 {}
包裹生成一个块级作用域,就能在这个块级作用域中声明一个局部变量。
{
let a = 1
window.clgA = function(){
console.log(a)
}
} //这个代码块的作用和上面的代码块的作用是一样的
{
let b = 2
}
cosnole.log(b) //报错,因为无法访问到 b 这个局部变量
let 的 暂时性死区
//通过注释分别输出 console.log(a) 观察结果
{
let a = 1
console.log(a) // 1
{
console.log(a) // 报错
let a = 2
console.log(a) // 2
{
let a = 3
console.log(a) // 3
}
}
}
因为 let 不会提前,所以在变量没有被 let 声明之前访问该变量就会报错,这就是 let 声明的暂时性死区。由于有了这个特性,let声明的变量访问过程非常清晰,声明就能用,不声明就不能用。所以建议尽量用let
声明变量!!!
同时,在同一个块级作用域中,let不能同时声明 2 个名称一样的变量,否则报错,而 var 则不会,这也是 let 的优越点。
const
声明
const 可以声明一个常量,只有一个赋值机会,而且必须在声明时候赋值。
window
声明全局变量
可以通过 window.[Name]来声明一个全局变量