在 JavaScript 中有,全局作用域,函数作用域和块级作用域。

全局作用域

全局作用域是最外层的作用域,在代码的任何地位上都可能拜访到。

var scope = 'window'function foo() {  console.log(scope) // window}foo()console.log(scope) // window

在上述代码中,咱们在函数中申明了一个变量 scope ,在全局作用域和函数作用域中都能够拜访到。

函数作用域

创立一个函数,就会创立对应函数的作用域。在函数的内部,无奈间接拜访函数外部的变量。

function foo() {  var scope = 'functionScope'  console.log(scope) // functionScope}foo()console.log("out foo", scope)// Uncaught ReferenceError: scope is not defined

在上述代码中,咱们在函数中申明了一个变量 scope ,在函数外拜访它,是拜访不到的,同时报了一个谬误。

块级作用域

应用let 和 const 会造成块级作用域,在块级作用域的内部,无奈间接拜访块外部的作用域。

{  let scope= 'letScope'}console.log('scope', scope)// Uncaught ReferenceError: scope is not defined

在上述代码中,咱们在大括号中用 let 申明了一个变量 scope ,在大括号外拜访它,是拜访不到的,同时报了一个谬误。

作用域链

当查找一个变量时,会在以后的作用域中查找,如果以后作用域中没有找到,则往上一层的作用域中查找,直到全局作用域中,(如果在全局作用域中没有找到,通常会报错),这就造成了作用域链。

在编译阶段,会创立并保留指向上一级的作用域,作用域是在创立的时候确立的,咱们来看一个例子。

var scope = 'window'function bar() {  var scope = 'bar'  function foo() {    console.log(scope) // bar  }  foo()}bar()

foo 的上一级作用域是函数 bar 的作用域,当执行 foo 函数,函数中没有找到定义的 scope 变量,会向上一层的作用域中查找,找到变量 scope 的值为 'bar',因而打印出 bar。

咱们扭转下 foo 函数定义的地位,在全局作用域中定义 foo 函数,因而它的上一层作用域是全局作用域。

var scope = "window";function foo() {  console.log(scope); // window}function bar() {  var scope = "bar";  foo(); }bar();

在 bar 函数中执行 foo 函数,函数中没有找到定义的 scope 变量,会向上一层的作用域中,即全局作用域中查找,找到变量 scope 的值为 'window',因而打印出 'window。

通过以上两个咱们可知,函数作用域是在代码编译阶段执行的,不会随代码的执行,动静的扭转。

以上就是无关作用域的分享,心愿对大家有所帮忙。

本文由mdnice多平台公布