隐式声明 var let const window

先看代码块

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]来声明一个全局变量


拓展:理解let与const

你可能感兴趣的:(隐式声明 var let const window)