JavaScript闭包和作用域链的定义实现

JavaScript闭包和作用域链的定义实现

什么是闭包?

在JavaScript中,闭包是指每个函数在创建时会生成一个自己的执行环境,这个执行环境可以访问到它自身定义的变量、参数,也可以访问父级的变量,而且这个执行环境可以一直存在,即使函数执行完,此时这个执行环境也不会被销毁。

简单来说,就是可以访问父级作用域的函数,创建出来的执行环境,这种执行环境中包含了函数内部定义的变量、参数以及外层函数和全局作用域中定义的变量。

闭包的实现方式

闭包的实现方式很简单,即函数内部又嵌套了一个函数,并且内部的函数引用了外部函数的变量或参数。这样的话,内部函数就形成了一个闭包,因为它可以访问到外部函数中的变量或参数。

下面是一个简单的闭包示例:

function outer() {
  var a = 1;
  return function inner() {
    console.log(a);
  }
}

var innerFunc = outer();
innerFunc(); // 输出:1

在这个示例中,outer返回了内部函数inner。内部函数使用了外部函数outer中的变量a,这种使用即为闭包。

什么是作用域链?

在JavaScript中,每一个执行环境都会有一个变量对象,叫做活动对象(activation object,AO)或者执行上下文(Execution context)。

"作用域链"是JavaScript中非常重要的概念之一。每一个函数的执行上下文中有一个变量对象,而这个变量对象中包含了当前作用域中所有的局部变量。在获取一个变量的时候,JavaScript会从当前执行上下文的变量对象中寻找,如果找不到则会从父级执行上下文的变量对象中寻找,直到找到全局执行上下文的变量对象。

即,当一个变量在当前执行上下文中被引用时,JavaScript会按照作用域链的顺序依次查找该变量所在的执行上下文,直到找到该变量所在的变量对象为止。

作用域链的实现方式

在JavaScript中,作用域的链式结构可以用一组对象来实现,这个对象集合被称为“作用域链”。

作用域链的实现与闭包密切相关,当一个函数调用时,它会创建一个新的执行上下文,并且在该执行上下文中自动创建一个新的作用域链,这个链的头节点指向该执行上下文的变量对象。

下面是一个示例:

var a = 1;
function outer() {
 var b = 2;
 function inner() {
   var c = 3;
   console.log(a + b + c);
 }
 inner();
}
outer(); // 输出:6

在这个示例中,当执行outer函数时,会在全局上下文中自动创建一个outer的函数执行上下文,它会在其自身的变量对象上查找变量b,并在其作用域链的下一级作用域对象上查找变量a,最后,在inner的执行上下文中查找到变量c。使用作用域链,我们可以在当前作用域上方的作用域中查找变量a的值。

示例说明

示例一

function getCounter() {
  var count = 0;
  return function inc() {
    count++;
    console.log(count);
  }
}

var counter = getCounter();
counter(); // 输出:1
counter(); // 输出:2

在这个示例中,函数getCounter返回了一个内部函数inc(即闭包),它引用了getCounter函数中的变量count。这里我们通过将闭包inc的引用赋值给counter,并调用它两次,捕获和维护了count变量的状态信息,每次调用输出递增的计数器值。

示例二

function createAdditionFunc(x) {
  return function(y) {
    return x + y;
  };
}

var addTen = createAdditionFunc(10);
console.log(addTen(5)); // 输出:15

在这个示例中,createAdditionFunc返回了一个闭包函数,该函数可以捕获到外部函数中传入的参数x的值,并返回一个内部函数addition,该函数在被调用时,可以接收参数y,并将外部函数的x和参数y相加并返回。

我们通过在创建addTen时向createAdditionFunc中传入参数10,就得到了一个新的闭包函数addTen,它的执行结果就是x为10时的返回结果。在我们调用addTen(5)时,就得到了15这个结果。

阅读剩余 54%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript闭包和作用域链的定义实现 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • JS实现电子时钟入门操作

    JS实现电子时钟是前端开发中一个常见的功能,下面我来为大家介绍一下实现步骤: 步骤一:创建HTML结构 首先需要建立html结构,在标签内添加一个 标签用来存放时钟显示的部分,同时还需要使用CSS样式对时钟进行美化。示例代码如下: <!DOCTYPE html> <html> <head> <meta charset…

    JavaScript 2023年6月11日
    00
  • javascript 取小数点后几位几种方法总结

    关于JavaScript取小数点后几位的方法,可以结合下面的代码和说明来进行总结: 一、使用toFixed方法 JavaScript内置的toFixed方法可以将一个数字四舍五入为指定小数位的数字字符串,具体语法如下: numObj.toFixed([digits]) 参数digits是可选的,表示需要保留的小数位数,如果不传入该参数则默认保留0位小数。调用…

    JavaScript 2023年6月11日
    00
  • javascript中Object使用详解

    Javascript中Object使用详解 简介 在Javascript中,Object是所有类的根源,几乎所有的对象都是Object的实例,Object可以看做是Javascript中所有类中共有的属性和方法的集合。 在本文中,我们将详细介绍在Javascript中如何使用Object。 基本语法 创建Object有两种方式:使用Object构造函数或使用…

    JavaScript 2023年5月27日
    00
  • Javascript实现可旋转的圆圈实例代码

    下面是实现可旋转的圆圈的Javascript代码的攻略: 步骤一:HTML结构 首先,我们需要在HTML文件中创建一个canvas元素和一个用于控制旋转的按钮。 <canvas id="circle-canvas"></canvas> <button id="rotate-button"&…

    JavaScript 2023年5月28日
    00
  • javascript实用小函数使用介绍

    JavaScript实用小函数使用介绍 什么是JavaScript实用小函数? JavaScript实用小函数,指的是那些不需要大段代码就能完成某些特定操作或实现某些特定功能的函数。这些函数通常都很简单,但能够大大提高我们编写JavaScript代码的效率。 JavaScript实用小函数的使用 JavaScript实用小函数的使用非常简单,一般只需要将其复…

    JavaScript 2023年5月18日
    00
  • javascript函数以及基础写法100多条实用整理

    JavaScript函数是一段可以被反复调用执行的代码,这种代码的主要作用是完成一个独立的功能。JavaScript函数具有很高的可重用性和灵活性,常被用来封装一些特定的处理逻辑以便于在需要的时候调用。接下来将为大家介绍JavaScript函数的基础写法,包括参数、返回值、作用域、闭包等内容。 Function基础写法 无参函数 无参函数即不接受任何参数的函…

    JavaScript 2023年5月18日
    00
  • 使用ajax的post同步执行(实现方法)

    使用 AJAX 的 POST 请求同步执行可以使用 jQuery AJAX 方法中的 async 属性,将其设置为 false。 使用 jQuery,可以使用如下代码实现 AJAX 的 POST 请求同步执行: $.ajax({ url: ‘yourUrl’, type: ‘POST’, async: false, data: yourData, succe…

    JavaScript 2023年6月11日
    00
  • Three.js快速入门教程

    下面是”Three.js快速入门教程”的完整攻略,涵盖了安装Three.js、创建场景、添加网格、添加光源、渲染场景等基本步骤。 1. 安装Three.js 在使用Three.js之前,我们需要先将其引入项目中。可以通过以下两种方式来引入: 下载Three.js的源文件到本地并且引入: “`html 2. 在需要使用Three.js的文件中使用CDN地址:…

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