关于后端:JavaScript-中的作用域

19次阅读

共计 1275 个字符,预计需要花费 4 分钟才能阅读完成。

在 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 多平台公布

正文完
 0