跳到主要内容

变量作用域

  • 作用域即变量可以生效使用的范围
  • JavaScrip中有 全局作用域局部作用域 两种
  • 想对应下也就有了 全局变量局部变量

全局作用域/变量

  • 全局作用域,即程序所有地方都可以访问和使用
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
}
logd(a)
test()
logd(a)

// 返回 1

EasyClick中特殊用法

  • 在EasyClick中, 全局变量在js文件夹下全局生效,或在layout下subjs文件夹下全局生效
  • 但js文件夹和layout文件夹不互通
  • 在EasyClick中,一般, 我们会将全局变量定义在 main.js 开头, 以方便我们管理和修改
  • main.js会在所有文件最后进行加载,其他文件按idea排序顺序加载
  • 因此不建议在其他js文件中执行函数和代码,以免报错

局部作用域/变量

  • {} 代码块包起来的变量, 叫做局部变量,其作用域,一般就在 {} 中生效
  • 如果多个 {} 嵌套, 下层 {} 可以访问上层的变量, 二者属于归属关系
  • 局部变量,会随着代码块执行完毕而自动销毁
{
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)

logd("a", a)
// 返回 参数1 1
// 返回 参数1 2

// 返回 a 1

const默认是全局

  • 在EasyClick中,const定义后就不会再变,与es6不同
  • 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
a = 2
logd(a)
{
const a = 1
}
logd(a)
// 返回 undefined
// 返回 1