JavaScript的作用域

目录

目标

概述

实战

变量提升

var

let

const

作用域


目标

        掌握变量的创建方法,了解他们的作用域。


概述

有三种方法创建变量,分别是var、let、const,区别如下:

特性varletconst
作用域函数作用域块级作用域块级作用域
变量提升是,但值是undefined是,但未初始化(TDZ)是,但未初始化(TDZ)
是否可重新赋值可以可以不能
是否可重复声明可以不可以不可以
是否必须初始化

        其中,var是旧代码的变量声明方式,考虑到用这种方式声明变量会导致各种问题,官方推荐使用let,尤其在循环中。const因为不可以重新赋值和必须初始化的原因,所以适合声明常量。


实战

变量提升

        变量和函数声明会被提升到其作用域的顶部,但不同的声明方式(var、let、const)在提升时的行为不同。如果输出一个没有定义的变量,则会报ReferenceError错误,代码如下:

//Uncaught ReferenceError ReferenceError: a is not defined
console.log(a)

var

//undefined
console.log(a)
var a = 1
//1
console.log(a)

等价于以下代码:

var a
//undefined
console.log(a)
a = 1
//1
console.log(a)

结论

        var具备变量提升的功能,变量被提升后初始化为undefined


let

//报错:Uncaught ReferenceError ReferenceError: Cannot access 'a' before initialization
console.log(typeof a); 
//如果没有这行代码,则第一个输出是undefined
let a =1;
//不会输出
console.log(a);

结论

        let具备变量提升的功能,变量被提升但没有初始化。


const

//报错:Uncaught ReferenceError ReferenceError: Cannot access 'a' before initialization
console.log(typeof a); 
//如果没有这行代码,则第一个输出是undefined
const a =1;
//不会输出
console.log(a);

结论

        const具备变量提升的功能,变量被提升但没有初始化。


作用域

        var是函数作用域,let和const是块级别作用域。也就是说:var的作用范围仅限于最近的函数。let和const的作用域是最近的{}块内,出了这个块就无法访问。

演示

function fun(){
    if(true){
        var a=1
    }
    console.log(a)
}
//1
fun()

function fun2(){
    if(true){
        let b=1
    }
    console.log(b)
}

try {
    fun2()
} catch (error) {
    //报错了: b is not defined
    console.log("报错了:",error.message)
}

function fun3(){
    if(true){
        const c=1
    }
    console.log(c)
}

try {
    fun3()
} catch (error) {
    //报错了: c is not defined
    console.log("报错了:",error.message)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值