全面了解JavaScript的作用域链

下面我会详细讲解全面了解 JavaScript 的作用域链的攻略。

什么是 JavaScript 的作用域链?

JavaScript 的作用域链是由当前执行环境的变量对象和它的父级环境的变量对象构成的一条链。当执行环境需要访问一个变量时,它会首先在当前的变量对象中查找,如果没有找到,它会从父级环境的变量对象中查找,直到找到该变量的值或者查找到全局作用域,如果还没有找到就会报错。

作用域链的创建方式

当执行一个函数时,会创建一个新的执行环境,并且将其加入到作用域链的顶端。

下面是一个例子:

var a = 1;
function foo() {
  var b = 2;
  function bar() {
    var c = 3;
    console.log(a + b + c);
  }
  bar();
}
foo();

在上面的例子中,当执行 foo 函数时,会创建一个新的执行环境,并且将其加入到作用域链的顶端,也就是说作用域链的顶端是 foo 函数的变量对象。当执行 bar 函数时,会创建一个新的执行环境,并且将其加入到作用域链的顶端,也就是说作用域链的顶端是 bar 函数的变量对象,而 foo 函数的变量对象则成为了 bar 函数的父级变量对象。

示例说明

下面是两个示例来说明作用域链的使用方式:

示例一

var a = 1;
function foo() {
  var b = 2;
  function bar() {
    var c = 3;
    console.log(a + b + c);
  }
  return bar;
}
var baz = foo();
baz();

在上面的代码中,当调用 foo 函数时,会创建一个新的执行环境,并且将其加入到作用域链的顶端。然后函数 barfoo 函数返回后,函数 bar 的作用域链仍然是 foo 函数的变量对象和全局变量对象的链。因此,在调用 baz 函数时,会首先在当前的变量对象中查找 a,如果没有找到,就会沿着作用域链向上查找,在 foo 函数的变量对象中找到 b,在全局变量对象中找到 a,然后将它们相加并输出。

示例二

var a = 1;
function foo() {
  var a = 2;
  function bar() {
    console.log(a);
  }
  return bar;
}
var baz = foo();
baz();

在上面的代码中,当调用 foo 函数时,会创建一个新的执行环境,并且将其加入到作用域链的顶端。然后函数 barfoo 函数返回后,函数 bar 的作用域链仍然是 foo 函数的变量对象和全局变量对象的链。因此,在调用 baz 函数时,会首先在当前的变量对象中查找 a,由于函数 bar 中没有定义局部变量 a,所以会在父级作用域中查找,即在 foo 函数的变量对象中找到 a,输出 2

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:全面了解JavaScript的作用域链 - Python技术站

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

相关文章

  • 原生js实现倒计时–2018

    原生js实现倒计时–2018 本文将介绍如何使用原生js实现一个倒计时效果来迎接2018年的到来。 前置知识 在学习本文之前,请确保您已经具备以下基本的前端知识:- HTML标记语言- CSS基础样式及布局- JavaScript基础知识- DOM操作基础 HTML代码 首先我们需要在页面上添加一个用于显示倒计时的容器,其结构如下所示: <div i…

    JavaScript 2023年5月27日
    00
  • 纯JS实现的读取excel文件内容功能示例【支持所有浏览器】

    下面是详细讲解“纯JS实现的读取excel文件内容功能示例【支持所有浏览器】”的完整攻略。 1. 准备工作 在使用JS读取excel文件之前,需要先引入一些第三方库,下面是这些库的名称和链接: SheetJS – 一个纯JS实现的excel文件读写库,支持xlsx、csv、ods等多种格式。 FileSaver.js – 一个提供了文件保存功能的JS库,用于…

    JavaScript 2023年5月27日
    00
  • JavaScript 定义function的三种方式小结

    当我们使用 JavaScript 时,定义函数是非常基础、常见的一个操作。很多初学者可能会比较迷惑 JavaScript 定义函数的方式,下面我们来详细地讲解一下。 1. function 声明 定义 function 的最基本方式是使用 function 声明,其语法如下: function 函数名([参数1, 参数2, …]) { 函数体 } 其中,…

    JavaScript 2023年5月27日
    00
  • JavaScript实现烟花特效(面向对象)

    当下,烟花特效是web前端常见的动画效果之一,本攻略将详细介绍如何通过JavaScript编写实现烟花特效。 步骤一:创建HTML文件 在开发本特效之前,首先需要建立一个HTML文件用于展示页面内容。以下是一个基本的HTML模板,用户可以根据需要添加和修改其他元素: <!DOCTYPE html> <html> <head&gt…

    JavaScript 2023年6月10日
    00
  • JS Array创建及concat()split()slice()的使用方法

    JS Array创建及concat()split()slice()的使用方法 1. JS Array创建 JS中创建数组有两种方式:使用数组字面量和使用Array 构造函数。下面是两种方式的定义方法。 1.1 使用数组字面量: var fruits = ["apple", "banana", "orange&…

    JavaScript 2023年5月27日
    00
  • 客户端 使用XML DOM加载json数据的方法

    客户端使用XML DOM加载JSON数据的方法可以分为以下几个步骤: 通过XMLHttpRequest对象发起网络请求,获取JSON数据; 将JSON数据转换为字符串,再使用DOMParser对象解析成XML格式; 通过XML DOM操作获取需要的数据。 下面是一个示例代码,通过XMLHttpRequest获取JSON数据并转换为XML格式: // 创建XM…

    JavaScript 2023年5月27日
    00
  • 新手入门js闭包学习过程解析

    新手入门JS闭包学习过程解析 JS闭包是JS中一个非常重要且常见的概念,但它的概念对于初学者来说可能会比较难理解和掌握。本文将详细讲解新手如何入门JS闭包,并提供相关示例进行说明。 什么是JS闭包 JS闭包(Closure)是指有权访问另一个函数作用域中变量的函数,即在函数内部创建一个可以访问外部变量的作用域。它是指那些能够访问自由变量的函数,即使在这些函数…

    JavaScript 2023年6月10日
    00
  • js正则格式化日期时间自动补0的两种解法

    下面是“js正则格式化日期时间自动补0的两种解法”的完整攻略。 步骤一:获取日期时间值 首先,我们需要获取日期时间的值,通常可以用 Date 对象。 const date = new Date(); 解法一:使用 String.prototype.padStart() String.prototype.padStart() 是 ES2017 中新增的方法,可…

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