先看代码块
a = 1
var a = 1
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)
}
})()
let声明
为了解决var的弊端,方便使用局部变量,let应运而生,通过一对 {}包裹生成一个块级作用域,就能在这个块级作用域中声明一个局部变量。
{
let a = 1
window.clgA = function(){
console.log(a)
}
}
{
let b = 2
}
cosnole.log(b)
let 的 暂时性死区
{
let a = 1
console.log(a)
{
console.log(a)
let a = 2
console.log(a)
{
let a = 3
console.log(a)
}
}
}
因为 let 不会提前,所以在变量没有被 let 声明之前访问该变量就会报错,这就是 let 声明的暂时性死区。由于有了这个特性,let声明的变量访问过程非常清晰,声明就能用,不声明就不能用。所以建议尽量用let声明变量!!!
同时,在同一个块级作用域中,let不能同时声明 2 个名称一样的变量,否则报错,而 var 则不会,这也是 let 的优越点。
const 声明
const 可以声明一个常量,只有一个赋值机会,而且必须在声明时候赋值。
window声明全局变量
可以通过 window.[Name]来声明一个全局变量