JavaScript进阶(二)词法作用域与作用域链实例分析

我来为你详细讲解“JavaScript进阶(二)词法作用域与作用域链实例分析”的完整攻略。

什么是词法作用域

词法作用域(Lexical Scope)是指变量在程序中的作用域是由它在代码中声明的位置所决定的。也就是说,变量的作用域在定义时就已经确定了,不会受到函数内部的影响。

词法作用域 vs 动态作用域

JavaScript 采用的是词法作用域,而不是动态作用域。动态作用域是指变量的作用域取决于它在运行时所处的上下文环境,而不是在定义时确定。这种作用域的语言包括 bash、Perl、Lua 等等。

我们看一个示例:

var x = 'global';

function test () {
  console.log(x);
}

function foo () {
  var x = 'function';
  test();
}

foo(); // 输出: global

在这个例子中,test 函数里的 console.log(x) 输出的是全局变量 x,而不是函数 foo 中定义的局部变量 x,这就体现了词法作用域的特性。

作用域链

所谓作用域链(Scope Chain),就是在 JavaScript 的函数执行过程中,JavaScript 引擎会按照函数嵌套的层次查找变量的过程。

作用域链的查找顺序是由内而外、由下往上,最先查找当前函数的变量,如果找不到就往上一层函数中查找,直到找到全局作用域,如果还没有找到,则认为变量在当前作用域不存在。

我们来看一个作用域链的示例:

var x = 'global';

function outer () {
  var y = 'outer';

  function inner () {
    var z = 'inner';
    console.log(x, y, z);
  }
  inner();
}

outer();

在这个例子中,inner 函数中查找变量的过程是这样的:首先查找自身作用域中是否有 z,有的话直接使用;如果没有,则查找父级作用域,也就是 outer 函数中是否有 y,如果有,则使用;如果 outer 函数中也没有,则继续查找全局作用域中是否有 x,如果有,则使用。

示例:

接下来,我们来看两个示例:

示例一

我们先来看一个不使用 var 声明变量的示例,这是一个非常典型的 JavaScript 陷阱:

function foo () {
  x = 10;
}

foo();

console.log(x); // 输出: 10

在这个例子中,我们没有使用 var 声明变量 x,而是直接在函数内对它进行赋值。此时,JavaScript 引擎会默认将其当作全局变量,并把它添加到全局对象(window)中。

因此,当我们在函数外部调用变量 x 的时候,会直接从全局作用域中查找,从而输出 10。

示例二

接下来我们看一个更复杂的示例:

var x = 'global';

function outer () {
  var y = 'outer';

  function inner () {
    var z = 'inner';
    console.log(x, y, z);
  }
  inner();
}

function foo () {
  var x = 'function';
  outer();
}

foo();

在这个例子中,我们定义了全局变量 x,在函数 foo 中定义了局部变量 x,然后调用了函数 outerouter 内部定义了变量 yinner 内部定义了变量 z

当我们调用 foo 函数后,控制台输出的结果是:global outer inner

这是因为在 inner 函数中,先查找自身作用域中是否有 z,直接找到后输出;如果没有,则查找父级作用域,也就是 outer 函数中是否有 y,找到后输出;如果 outer 函数中也没有,则继续查找全局作用域中是否有 x,找到后输出。

注意,这里的 x 指的是全局变量 x,而不是函数 foo 中定义的局部变量 x,这就是词法作用域的特性。

总结一下:

词法作用域指变量在程序中的作用域是由它在代码中声明的位置所决定的,而不会受到函数内部的影响。

作用域链是在 JavaScript 的函数执行过程中,JavaScript 引擎会按照函数嵌套的层次查找变量的过程,并把查找的结果形成链式结构。

最后,我们需要注意在 JavaScript 中避免出现不使用 var 声明变量的情况,因为这么做会破坏作用域链,导致代码出现意料之外的结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript进阶(二)词法作用域与作用域链实例分析 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • uniapp改变底部安全区顶部手机信号时间电池栏颜色样式

    要实现uniapp改变底部安全区顶部手机信号时间电池栏颜色样式,我们可以通过修改程序的manifest.json文件来实现。 步骤如下: 1. 创建 uniapp 项目 在命令行中输入以下命令,即可创建一个新的uniapp项目: vue create –preset dcloudio/uni-preset-vue my-project 2. 修改 mani…

    JavaScript 2023年6月11日
    00
  • javascript对XMLHttpRequest异步请求的面向对象封装

    那我来详细讲解一下“javascript对XMLHttpRequest异步请求的面向对象封装”的完整攻略。 首先需要了解的是什么是XMLHttpRequest?XMLHttpRequest是一个内置的对象,它可以发送HTTP、HTTPS请求,从而实现异步请求数据。面向对象封装指的是把XMLHttpRequest作为一个类,通过封装把它的属性和方法进行封装,以…

    JavaScript 2023年6月11日
    00
  • 在 React 中使用 i18next的示例

    当开发 React 应用时,国际化(i18n)成为一个非常重要的问题。i18next 是一个非常流行的 i18n 解决方案,它提供了友好的 API、广泛的文件格式支持(如 JSON、YAML 等)以及非常灵活的插件系统,支持多种后端存储和本地化工具。 在使用 React 开发应用时,我们可以利用 i18next 帮助我们实现国际化。以下是实现“在 React…

    JavaScript 2023年6月11日
    00
  • JavaScript中各种引用类型的常用操作方法小结

    让我来详细讲解一下“JavaScript中各种引用类型的常用操作方法小结”。 引用类型的定义 引用类型指的是一类对象的实例,这些实例由自己定义的构造函数创建。每个引用类型都提供了可以访问它的属性和方法。JavaScript中常见的引用类型有Object、Array、Date、RegExp等等。 Object类型的操作方法 Object类型是所有引用类型中最基…

    JavaScript 2023年5月19日
    00
  • JS Thunk 函数的含义和用法实例总结

    JS Thunk 函数实际上是一种特殊的函数,它将一个多参数函数转换成一个只接受回调函数为参数的单参函数。目的是为了让函数的执行结果可以通过回调函数来获取。 使用 Thunk 函数可以有效地处理异步操作,使得回调嵌套不那么深,也更容易进行错误捕捉。以下将详细解释 Thunk 函数的含义和用法实例总结。 1. 概念 1.1 Thunk 函数的定义 Thunk …

    JavaScript 2023年5月27日
    00
  • js借助ActiveXObject实现创建文件

    使用JavaScript创建文件通常需要依靠 ActiveXObject 对象,这个对象是一个被 Internet Explorer 浏览器支持的特殊的对象,可以用于访问本地文件系统。下面是使用 ActiveXObject 对象实现创建文件的详细攻略: 1. 创建 ActiveXObject 对象 JavaScript 中可以使用 “new ActiveXO…

    JavaScript 2023年5月27日
    00
  • 微信页面倒计时代码(解决safari不兼容date的问题)

    接下来我将为您详细讲解如何在微信页面中使用倒计时代码,并解决 Safari 不兼容 Date 的问题。 标准的倒计时代码 首先,我们先来看一下在常规网页中使用的倒计时代码: function countDown(second, callback) { let timer = setInterval(() => { callback(second–) …

    JavaScript 2023年6月10日
    00
  • JavaScript数据结构与算法之队列原理与用法实例详解

    JavaScript数据结构与算法之队列原理与用法实例详解 什么是队列? 队列是一种数据结构,可以用来存储一系列元素,支持在队列尾部插入元素,在队列头部删除元素的操作。这种数据结构的特点是:先进先出(First-In-First-Out,简称FIFO),即最先插入队列的元素,也会最先从队列中被删除。 队列的实现 队列可以用数组或链表来实现,这里我们以数组为例…

    JavaScript 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部