深入理解JavaScript高级之词法作用域和作用域链

yizhihongxing

深入理解JavaScript高级之词法作用域和作用域链

什么是词法作用域

词法作用域是指JavaScript代码的作用域是基于源代码中变量和函数声明的位置来确定的,而不是基于运行时的调用栈。换言之,词法作用域与代码的声明位置有关。

例如,下面的代码示例中,bar函数在foo函数内部定义,因此它的作用域(也称为“词法环境”)包含了foo函数范围内的变量,即x变量。

function foo() {
  var x = 1;
  function bar() {
    console.log(x);
  }
  bar();
}
foo(); // 输出1

作用域链

每个JavaScript函数都与一个“作用域链”相关联,该作用域链是由当前执行环境和所有包含它的外部环境中的变量对象组成的。变量对象包含了在当前执行环境中定义的变量,以及在父级执行环境中定义的变量。当需要访问一个变量时,JavaScript引擎会沿着作用域链向上查找,直到找到该变量为止。

例如,下面的代码示例中,bar函数在foo函数内部定义,因此它的作用域链包含了foo函数的变量对象和全局变量对象。当bar函数需要访问x变量时,JavaScript引擎会从bar函数的作用域开始向上查找,直到找到该变量为止。

var x = 1;
function foo() {
  var x = 2;
  function bar() {
    console.log(x);
  }
  bar();
}
foo(); // 输出2

示例说明

示例1

function test() {
  var x = "hello";
  function innerTest() {
    console.log(x);
  }
  x = "world";
  return innerTest;
}
var fn = test();
fn(); // 输出"world"

在上述示例中,innerTest函数定义在test函数内部,但它在return语句中被返回,这就导致它可以在test函数的外部被调用。innerTest函数的作用域链中包含了test函数的变量对象和全局变量对象。当innerTest函数被调用时,JavaScript引擎会从innerTest函数的作用域对象开始向上查找,直到找到x变量为止。由于x变量在test函数内部被重新赋值为"world",因此最终输出的结果为"world"。

示例2

var a = 1;
var b = 2;
function outer() {
  var a = 3;
  function inner() {
    console.log(a+b);
  }
  return inner;
}
var fn = outer();
fn(); // 输出5

在上述示例中,inner函数在outer函数内部定义,因此它的作用域链包含了outer函数的变量对象和全局变量对象。当inner函数被调用时,JavaScript引擎会从inner函数的作用域对象开始向上查找,直到找到ab变量为止。由于a变量在outer函数内部被重新赋值为3,而b变量属于全局变量,因此最终输出的结果为5。

总结

词法作用域和作用域链是JavaScript中非常重要的概念,对于理解函数的作用域和变量的作用范围有着关键的作用。理解这些概念能够帮助我们更好地编写和调试JavaScript代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解JavaScript高级之词法作用域和作用域链 - Python技术站

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

相关文章

  • 纯javascript代码实现计算器功能(三种方法)

    当我们想在网页中添加一个计算器功能的时候,可以使用Javascript来实现。以下是三种使用Javascript实现计算器功能的方法: 方法一:利用eval()函数计算表达式 在HTML文档中添加以下代码: <div id="container"> <input type="text" id=&quo…

    JavaScript 2023年5月27日
    00
  • 在JavaScript中使用timer示例

    下面是关于在JavaScript中使用timer的完整攻略: 什么是 Timer? 在 JavaScript 中, Timer 用于将一个代码块延迟一段时间后执行,或者每隔一段时间就重复执行。Timer 有两种类型:setTimeout()和setInterval()。 setTimeout() setTimeout()方法可用于延迟一次性执行代码的执行。可…

    JavaScript 2023年5月27日
    00
  • JavaScript入门教程(6) Window窗口对象

    JavaScript入门教程(6) Window窗口对象 在网页中,Window对象(窗口对象)是最高级别的对象,代表了一个浏览器窗口或者框架。本文将详细介绍Window对象的属性和方法,并给出相应的示例说明。 窗口对象属性 1. Window.outerWidth 和 Window.outerHeight 这两个属性表示浏览器窗口的宽度和高度,包括边框和滚…

    JavaScript 2023年5月28日
    00
  • js 与或运算符 || && 妙用

    下面是关于“JS 与或运算符 || && 妙用”的完整攻略,包含两个示例说明: 一、JS 与或运算符概述 在JS中,&&和||是常用的逻辑运算符,它们可以将多个条件判断合并在一起。在编写条件判断语句时,通过巧妙地使用逻辑运算符,可以让代码更加简洁、易懂,提高开发效率。 1.1 逻辑与运算符(&&) 逻辑与运算符…

    JavaScript 2023年5月18日
    00
  • 浅析$.getJSON异步请求和同步请求

    浅析 $.getJSON异步请求和同步请求 异步请求 异步请求是在发送请求的同时,不影响其他代码的执行,等到请求得到响应后再执行相应的操作。$.getJSON()方法是jQuery提供的一种异步请求JSON数据的方法。 语法 $.getJSON(url, [data], [callback]) url:必需,表示请求地址; data:可选,表示请求发送的数据…

    JavaScript 2023年5月27日
    00
  • JavaScript基础之函数详解

    JavaScript基础之函数详解 本篇攻略将详细讲解JavaScript中函数的相关知识,包括函数的定义、参数、返回值、作用域等内容。如果你刚刚开始学习JavaScript,或者想要加强对函数的理解,本篇攻略将是一个不错的选择。本篇攻略中的所有示例代码均可在浏览器中运行,方便调试和测试。 函数的定义 在JavaScript中定义一个函数通常有两种方式,分别…

    JavaScript 2023年5月17日
    00
  • 简易版本JSON.stringify的实现及其六大特性详解

    下面我来讲解“简易版本JSON.stringify的实现及其六大特性详解”的攻略。 前言 在日常的开发中,我们经常会用到JSON.stringify方法来将Javascript对象转换成JSON格式的字符串,可以方便地实现客户端和服务器端之间的数据交互。但是,我们并不总是清楚其内部是如何工作的。在本攻略中,我将给大家介绍如何用简易版本实现JSON.strin…

    JavaScript 2023年5月27日
    00
  • JavaScript如何实现元素全排列实例代码

    让我来为您详细讲解如何通过JavaScript实现元素全排列。 前置知识 在学习元素全排列之前,您需要掌握以下内容: JavaScript基础知识(变量、函数等) 递归算法 实现思路 下面是实现元素全排列的思路: 将数组的第一个元素与其他元素交换位置,得到一个新的数组。 对新数组中的除第一个元素外的剩余元素进行全排列,得到新的排列方式。 将第一个元素与其他元…

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