Skip to content

作用域

先来思考一下, 下面这两个例子, 控制台会输出什么?

js
for (let i = 0; i < 3; i++) {
    document.write("Test")
}
console.log(i)
js
function fun() {
    let Num = 20
}
fun()
console.log(Num)

不仅什么都不会输出, 反而还会报错(变量未定义)

一般来说, 一段代码中所用到的名字并不总是有效和可用的, 而限定这个名字的可用性和代码范围就是这个名字的作用域

作用域(scope)规定了变量能够被访问的范围, 离开了这个范围变量便不能被访问

作用域的使用提高了程序逻辑的局部性, 增强了程序的可靠性, 减少了名字冲突

  • 全局作用域(全局有效)
    • 作用于所有代码执行的环境(整个script标签内部)或者一个独立的js文件
  • 局部作用域(局部有效)
    • 作用于函数内的代码环境, 就是局部作用域.因为跟函数有关系, 所以也称为函数作用域

根据作用域的不同, 变量可以分为:

  • 全局变量(函数外部let的变量)
    • 全局变量在任何区域都可以访问和修改
  • 局部变量(函数内部let变量)
    • 局部变量只能在当前函数内部访问和修改

例子

全局变量

js
let Num = 10
console.log(Num) // 正常输出10
function fun() {
    console.log(Num) // 正常输出10
}
fun()

局部变量

js
function fun() {
    let Num = 10
    console.log(Num) // 正常输出10
}
fun()
console.log(Num)  // 报错(变量未定义)

警告

如果函数内部, 变量没有声明, 直接赋值, 也当全局变量看, 但是强烈不推荐!

js
function fun() {
    Num = 10
}
fun()
console.log(Num)  // 正常输出 10

总结

  • 只要是代码, 就至少有一个作用域
  • 写在函数内部的局部作用域
  • 如果函数中还有函数, 那么在这个作用域中就又可以诞生一个作用域
  • 访问原则: 在能够访问到的情况下先局部, 局部没有在找全局