变量作用域
- 作用域即变量可以生效使用的范围
- 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
特殊情况
- 如果创建变量时,未用
let或const来定义,当运行到此行,此变量会自动提升为全局变量 - 因此谨慎使用此特性, 容易引起不必要的异常
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