JavaScript 作用域

60 阅读3分钟

全局作用域

全局作用域,其中定义的变量函数可以在任何地方访问。但是,如果在函数内部没有使用关键字 varletconst 声明变量,则该变量将被隐式声明为全局变量

函数作用域

每个函数都有自己的作用域,函数内部声明的变量和函数参数只能在函数内部访问,外部代码无法访问。这意味着同名变量可以在不同的函数中存在而不会发生冲突。

访问顺序

内部作用域可以访问外部(闭包) 外部不能读取内部作用域

变量名,函数作用域提升

在 JavaScript 中,变量函数声明(使用function xx(){} 命名) 在代码执行之前会被 JavaScript 引擎提升(Hoisting)到它们所在作用域的顶部,这个过程是在代码实际执行之前发生的。也就是说,无论变量或函数声明在作用域内的哪个位置,它们都会被 JavaScript 引擎移动到作用域顶部。

demo

image.png 实际的代码,变量名,函数,会被提升到作用域顶部,如图

image.png

内部作用于访问外部,取决于函数定义位置,和调用无关

一个函数内部定义的变量(也称为局部变量)可以被这个函数内部的其他代码所访问。而这些变量只能在这个函数内部被访问,而不能在函数外部访问。但是,如果一个函数在另外一个函数内部定义,那么它就可以被这个外部函数所访问。

demo

image.png

  1. 调用log()
  2. 调用printName()
  3. 此时打印是 tim
  4. 原因: log 函数内部的变量,只能在log函数内访问,
  5. printfName 在外部 17行,变量提升, 打印的是 tim

这句话的意思是函数内部定义的变量(或函数)只能在这个函数内部被访问,而它们是否可以被外部访问取决于它们被定义的位置,而不是它们被调用的位置。

嵌套函数的访问

嵌套函数指,函数内部定义了一个函数(内部函数) 在JavaScript中,函数可以定义在另一个函数的内部,被称为内部函数或嵌套函数。当内部函数被定义时,它可以访问其外部函数中的变量,这些变量可以是函数作用域内定义的变量或全局变量。

然而,内部函数不能直接访问其外部函数的参数或局部变量。这是因为当外部函数执行完毕时,它的参数和局部变量就会被销毁,而内部函数仍然存在。因此,如果内部函数能够访问这些变量,那么在外部函数执行完毕后,内部函数将无法访问这些已经被销毁的变量,这将导致错误。

function outerFunction() {
  function innerFunction() {
    console.log(outerVar); // 抛出一个错误,因为 outerVar 没有被定义 
    let innerVar = "I am an inner variable";
  }

  let outerVar = "I am an outer variable";
  innerFunction();
}

outerFunction();

可以访问变量,但是不能访问外部函数的参数, 和局部变量 这个外部变量指在这个内部函数定义时,上面的为变量,可以访问, 下面的为局部变量,原因是下面还没有被定义.