JavaScript 是一门动态语言,其运行时的变量作用域是由函数嵌套关系所决定的。作用域链是 JavaScript 中一个非常重要的概念,是理解 JavaScript 作用域和变量查找机制的关键。
什么是作用域链?
在 JavaScript 中,每个函数都有自己的作用域。当访问一个变量时,JavaScript 引擎将首先在当前函数的作用域中查找该变量,如果没有找到,则将继续向上级作用域查找,直到找到该变量或者搜索到全局作用域为止。这个变量查找的路径就是作用域链。
作用域链的构建过程是在函数创建的时候确定的。当一个函数被创建时,它的作用域链就已经建立好了。作用域链中包含了该函数创建时所处的作用域以及所有外部函数的作用域。
作用域链的示例
下面我们来看一个简单的示例,演示作用域链的查找过程:
--- - - -- -------- ----- - --- - - -- -------- ----- - --- - - -- ------------- - - - --- - ------ - ------ -- -- -
在这个例子中,我们定义了三个变量 a、b、c,并将它们分别赋值为 1、2、3。然后我们定义了三个函数 foo、bar 和全局作用域下的 console.log 函数。最终在 foo 函数内部调用 bar 函数。
当 bar 函数执行时,它会先查找自己的作用域中是否有变量 c,由于在 bar 函数内部已经定义了变量 c,因此直接使用该变量。然后它会继续向上级作用域查找变量 b,在 foo 函数内部定义了变量 b,因此 bar 函数可以访问到变量 b。最后,bar 函数会继续向上级作用域查找变量 a,在全局作用域中定义了变量 a,因此 bar 函数可以访问到变量 a,从而计算出结果为 6。
闭包与作用域链
闭包是 JavaScript 中一个非常重要的概念。它指的是函数可以访问外部函数的变量,即使外部函数已经返回了。这是因为闭包在创建时会维护其所处的作用域链,使得它能够在以后的任何时候都可以访问到外部函数的变量。
下面我们来看一个闭包的示例:
-------- --------- - --- ----- - -- ------ -------- ----------- - -------- ------------------- -- - --- -------- - ---------- --- -------- - ---------- ----------- -- -- - ----------- -- -- - ----------- -- -- -
在这个例子中,我们定义了一个函数 counter,该函数内部定义了一个变量 count,并返回了一个匿名函数 increment。当我们调用 counter 函数时,它返回的是一个新的函数 increment。由于 increment 函数可以访问外部函数 counter 的作用域,因此它可以访问到变量 count,并且每次执行都会将 count 加一并输出。
接着,我们分别调用了两次 counter 函数,得到了两个不同的计数器函数 counter1 和 counter2。当我们分别调用 counter1 和 counter2 函数时,它们各自维护自己的 count 变量,并且只会对自己的 count 变量进行操作,从而实现了两个独立
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/8871