作用域是什么?

2021-03-20  本文已影响0人  Poppy11

前言

几乎所有编程语言最基本的功能之一,就是能够储存变量当中的值,并且能在对这个值进行访问和修改。事实上,正是这种储存和访问变量的值得能力将状态带给了程序。
若没有了程序这个概念,程序虽然也能够执行一些简单的任务,但它会受到高度限制,做不到非常有趣。
但是这就产生了几个问题:

在JavaScript解析的过程中,有三个重要的角色:引擎、编译器、作用域。

引擎、编译器和作用域是如何协同工作的呢?例如我们将var a = 2分解来看。

上面我们说到了引擎会查找变量,那么是如何查找的呢?

var a = 10; //这里引擎对a的查询是LHS
var b = a; //这里引擎对a的查询是RHS,对b的查询是LHS

可以看看下面这个练习,看看自己理解程度。

function foo(a){
  var b = a;
  return a + b;
}
var c = foo(2);

1、找到其中LHS查询(有3处)
2、找到其中RHS查询(有4处)

作用域嵌套(作用域链是什么?)

作用域嵌套,当一个块或者函数嵌套在另一个块或者函数中时,就发生了作用域嵌套。因此,当在当前作用域中无法找到某个变量的时候,引擎就会在外层嵌套的作用域中继续查找,直到查找到该变量或抵达最外层的作用域为止。
考虑以下代码:

function foo(a){
    console.log(a +b)
}
var b= 2
foo(2)

对b进行RHS引用,在当前作用域没有找到,但可以在上一级作用域中找到。

image.png

这个建筑代表程序中的嵌套作用域。第一层代表当前的执行作用域,建筑的顶层代表全局作用域。
LHS和RHS查找都会在当前楼层中进行查找,如果没有找到,就继续往上找,一旦抵达顶层,查找过程都会停止。
不成功的RHS引用会导致抛出ReferenceError异常。不成功的LHS引用会导致自动隐式的创建一个全局变量(非严格模式下),严格模式下会抛出同样的异常,

上一篇下一篇

猜你喜欢

热点阅读