跳到主要内容

变量作用域

  • 作用域即变量可以生效使用的范围
  • JavaScrip中有 全局作用域局部作用域 两种
  • 同样, 也就产生了 全局变量局部变量

全局作用域/变量

  • 全局作用域即程序所有地方都可以访问和使用
  • 一般, 我们会将全局变量定义在 main.js 开头, 以方便我们管理和修改
let 全局_参数1 = 1
let 全局_参数2 = 2
const 常量_参数1 = 1

function test() {
// 读取全局变量
logd(全局_参数1)
logd(全局_参数2)
logd(常量_参数1)
// 修改全局变量
全局_参数1 = 3
}

test()
logd(全局_参数1)

// 返回 1
// 返回 2
// 返回 1

// 返回 3

特殊情况

  • 如果创建变量时,未用 letconst 来定义,此变量会自动提升为全局变量
  • 因此谨慎使用此特性, 容易引起不必要的异常
function test() {
a = 1
}

test()
logd(a)

// 返回 1

局部作用域/变量

  • {} 代码块包起来的变量, 叫做局部变量,其作用域,一般就在 {} 中生效
  • 如果多个 {} 嵌套, 下层 {} 可以访问上层的变量, 二者属于归属关系
  • 局部变量,会随着代码块执行完毕而自动销毁
{
let a = 1
}
logd(a)
// 执行错误:ReferenceError: "a" is not defined

{
let a = 1
{
logd(a)
}
}
// 返回 1

什么是代码块

  • {} 大括号包起来的, 就是代码块
  • 平时接触的 if , for , function 等, 在定义时, 都有个 {} 结构,实际上就是代码块
if (true) {
// 代码块
let a = 1

}
logd(a);
// 执行错误:ReferenceError: "a" is not defined

函数参数是局部变量

let a = 1

function test(参数1) {
logd("参数1", 参数1)
参数1++
logd("参数1", 参数1)
}

test("a", a)

// 返回 参数1 1
// 返回 参数1 2

// 返回 a 1

const默认是全局

{
const a = 1
}
logd(a)
// 返回 1

暂时性死区

  • 当使用 letconst 声明变量时,就会出现暂时性死区(Temporal Dead Zone,简称 TDZ)
  • 它是指从代码块开始,到变量声明语句之前的区域
  • 在这个区域内, 访问该变量会报错
let a = 1
{
logd(a)
}
// 返回 1

{
logd(a)
let a = 2
logd(a)
}
logd(a)

// 返回 undefined
// 返回 2
// 返回 1