更多内容,欢迎关注我的公众号:dingtingli-pub
作用域和作用域链是 JavaScript 语言和其他编程语言中的基本概念。然而这些概念让许多 JavaScript 开发新手们觉得困惑。这些概念也是掌握 JavaScript 的关键。
对这些概念的正确理解,将帮助你写出更好,更高效和简洁的代码。这将反过来帮助你成为一个更好的 JavaScript 开发人员。
这篇文章我将解释什么是作用域和作用域链,JavaScript 引擎如何执行变量查询,以及这些概念的内部情况。
我们来了解一下 JavaScript 引擎是如何确定变量的作用域,并且在引擎盖下是如何进行变量查找的。
首先,我们讨论什么是作用域。作用域指的是变量的可访问性或者可见性,也就是说程序的哪些部分可以访问到变量或者说变量在哪是可见的。在 JavaScript 中有三种类型的作用域 - 全局作用域、函数作用域和块作用域。
全局作用域中任何不在函数或者块中的变量都可以被程序中的任何地方访问。在函数内声明的变量只能被该函数内部访问,这意味着它们不能被函数外部的代码访问。而块作用域中声明的变量只能被该块内的代码访问,它们不能被该块外面的代码访问。
作用域链是当在 JavaScript 中使用一个变量时,JavaScript 引擎将会尝试在当前的作用域中查询该变量的值。如果查找不到,它就会在外部作用域中继续查找,直到查找到该变量或者到达全局作用域。如果引擎在全局作用域中仍然查找不到该变量,它将会在全局作用域中隐性地声明这个变量(非 strict mode 下),或者返回一个错误。
例如,当函数bar() 被执行时,JavaScript 引擎在当前作用域中查找变量 baz 并且找到了。接下来,它在当前变量中查找变量 foo ,但是并没有找到,所以他在外面一层的作用域(示例中是在全局作用域)中继续查找,并且找到了。然后,我们将42 赋给了 number ,所以 JavaScript 引擎在当前作用域中查找 number 变量,然后在外层作用域中继续查找。
为了理解 JavaScript 引擎是如何进行变量查找的,我们必须先了解 JavaScript 中的词法环境概念。词法环境是一种结构,它保存标识符-变量的映射。新的词法环境是为每个词法作用域创建的,但是只有当该作用域中的代码被执行时才会被创建。词法环境也有一个对外部词法环境(即外部作用域)的引用。
JavaScript 引擎使用词法环境来存储变量,这意味着变量的作用域是在编译时确定的。在程序执行过程中,JavaScript 引擎使用词法环境来查找变量。
总结来说,作用域是一个变量可见和可访问的区域。就像函数一样,JavaScript 中的作用域也可以嵌套了,而且 JavaScript 引擎会遍历作用域链来查找程序中使用的变量。对这些概念有很好的理解会帮助你成为一个更有效率和更好的 JavaScript 开发人员。
本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。