作用域

155 阅读2分钟

<script>标签中的变量定义规则,及生产作用域下的变量访问规则

变量定义规则

  1. <script>标签环境中,使用关键字varlet,const来声明变量 ,属于全局变量,在此环境中可以任意访问并(修改)赋值。
  2. <script>标签环境中,声明了函数,并在函数中使用关键字varlet,const声明了变量。其变量为局部变量,并只能在其函数作用域下进行访问或(修改)赋值。注意在函数内部没有使用var、let、const关键字来声明变量,默认为就是全局变量

变量访问规则

  1. 在函数作用域下,可以访问全局变量。
  2. 在函数嵌套环境中,内层函数可以访问外层函数作用域下的变量,但是外层函数不访问内层函数作用域下的变量。
  3. 总结一点,在产生了作用域的环境下,内能访外,外不能访内
  4. 如果外层函数作用域必须要访问内层函数作用域下的变量,那么就形成了闭包问题

代码演示

var a = 123   // 全局变量
 // 1. 如果我们将全局作用域下的全局变量 a 注释掉
 // 2. var a = 123
 // 3. 然后我们在全局作用域的环境去打印 函数作用域下的局部变量 a 
 // 4. console.log(a)  其打印结果是 a is not defined
 // 5. 因为在全局作用域环境中我们将全局变量 a 注释掉了,所以 a 变量没有被定义
 // 6. 又因为不是在同一作用域环境下的变量,再加上 内能访外,外不能访内。所以如果是在同一作用域环境下也不能进行访问
function test() {
    var a = 456   // 在test 函数作用域下的局部变量
    console.log(a)  // 这里打印是 456
    // 1. 但是将test 函数作用域下的局部变量 a 注释掉
    // 2. var a = 456
    // 3. 在将其打印就是 123
}

结果分析

  1. 变量定义 变量定义.jpg
  2. 变量访问 变量的访问.jpg
  3. 函数作用域中声明变量的规则(隐式转换,函数内部未只用关键字来声明变量,会隐式用var) 函数作用域中声明变量的规则.jpg