Javascript 闭包详解及实例代码

yizhihongxing

JavaScript 闭包详解及实例代码

什么是闭包?

在 JavaScript 中,闭包是一种特殊的函数,它可以访问在它创建时外部作用域的变量和参数,即使这些变量和参数在函数调用时已经不存在了。

简单来说,闭包就是“函数和函数所能够访问的外部变量的一个共同体”。

闭包的运作原理

在 JavaScript 中,每次创建一个函数,都会同时创建一个作用域链(scope chain)。作用域链的作用是保存自由变量(free variable)的引用,自由变量指的是既不是函数参数也不是局部变量的变量。当函数执行时,函数会通过作用域链(向上遍历与创建该函数的作用域链相同的作用域链)访问自由变量,这就形成了闭包。

闭包的使用场景

闭包可以用于实现一些高级的,具有固定状态的功能,如函数柯里化(function currying)和模块化(module pattern)等。

闭包示例说明一:计数器

在这个示例中,我们创建了一个函数,这个函数可以让我们创建多个计数器。每个计数器都是独立的,可以独立递增、递减。

function createCounter() {
  var count = 0;
  return {
    increment: function () {
      count++;
    },
    decrement: function () {
      count--;
    },
    getCount: function () {
      return count;
    }
  }
}

var counter1 = createCounter();
var counter2 = createCounter();

console.log(counter1.getCount()); // 0
console.log(counter2.getCount()); // 0

counter1.increment();
counter1.increment();

console.log(counter1.getCount()); // 2
console.log(counter2.getCount()); // 0

counter2.decrement();

console.log(counter1.getCount()); // 2
console.log(counter2.getCount()); // -1

在这个示例中,createCounter() 是一个函数,它返回一个对象,这个对象包含三个方法。每个对象都包含一个局部变量 count,这个变量只能通过对象内部的方法访问。这个局部变量被保存在 createCounter() 函数的作用域链中,因为对象内部的方法可以访问它,所以每个对象都有一个独立的 count。

闭包示例说明二:函数柯里化

函数柯里化(function currying)是什么意思?指的是把接受多个参数的函数转换成接受一个单一参数(最初函数的第一个参数)的函数,并返回接受余下的参数,并且返回结果的新函数的技术。

示例代码:

function add(a, b) {
  return a + b;
}

function curry(fn) {
  var args = Array.prototype.slice.call(arguments, 1);
  return function () {
    var innerArgs = Array.prototype.slice.call(arguments);
    var finalArgs = args.concat(innerArgs);
    return fn.apply(null, finalArgs);
  };
}

var add10 = curry(add, 10);

console.log(add10(5)); // 15
console.log(add10(10)); // 20

在这个示例中,我们创建了一个函数 curry(),这个函数接受一个函数 fn,然后返回一个新的函数,这个新函数可以接受一个或多个参数。curry() 函数采用了类似“闭包”的形式,它保存了原函数的第一个参数,并在返回的新函数中使用。

结论

闭包是 JavaScript 强大的特性之一,它可以让我们实现很多高级的功能。但是,在使用闭包的时候,我们也要注意一些问题,比如内存泄漏等。所以,在使用闭包之前一定要了解它的运作原理和注意事项。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Javascript 闭包详解及实例代码 - Python技术站

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

相关文章

  • JavaScript Reduce使用详解

    JavaScript Reduce使用详解 在JavaScript中,数组的reduce方法可以让我们使用自定义的函数将数组中的所有元素汇总为一个值,该值既可以是一个数字,也可以是一个对象或数组。 reduce方法的语法 reduce方法的语法如下: array.reduce(callback[, initialValue]) 其中,参数callback为一…

    JavaScript 2023年5月27日
    00
  • 一个Js文件函数中调用另一个Js文件函数的方法演示

    为了更好地讲解“一个Js文件函数中调用另一个Js文件函数的方法演示”, 我们将分为以下几个部分介绍: 准备工作:建立两个JS文件,定义函数 示例一:在HTML文件中通过script标签依次引入两个JS文件并演示调用 示例二:通过webpack打包两个JS文件并演示调用 1. 准备工作 我们先建立两个JS文件,分别命名为 file1.js 和 file2.js…

    JavaScript 2023年5月27日
    00
  • 简介JavaScript中setUTCSeconds()方法的使用

    在讲解 setUTCSeconds() 方法之前,我们先来回顾一下JavaScript中Date对象的概念。 Date对象代表着时间,我们可以使用它来表示当前的时间,或者指定一个时间值。在JavaScript中,我们可以使用 new Date() 创建一个Date对象。该对象有多种方法,其中包括了 setUTCSeconds() 方法。 接下来,让我们来详细…

    JavaScript 2023年6月10日
    00
  • 浅析四种常见的Javascript声明循环变量的书写方式

    当需要在JavaScript中循环执行某个代码块时,我们可以通过四种常见的方式来声明循环变量。这四种方式分别为: for循环 for循环是JavaScript中最常用的循环语句,适用于已知循环次数和循环起始值的场景。for循环的语法格式如下: for (let i = 0; i < n; i++) { // 要循环执行的代码 } 其中,let i = …

    JavaScript 2023年6月10日
    00
  • JavaScript定时器详解及实例

    JavaScript定时器详解及实例 定时器(Timer)是JavaScript中的一个常用功能,它可以用来执行一些计划任务或者延迟执行某个任务。JavaScript中提供了两种类型的定时器:setTimeout() 和 setInterval()。本文将会详细介绍这两种定时器的使用方法以及一些示例说明。 setTimeout() setTimeout() …

    JavaScript 2023年5月27日
    00
  • 关于js中window.location.href,location.href,parent.location.href,top.location.href的用法与区别

    关于JS中window.location.href,location.href,parent.location.href,top.location.href的用法与区别 在JavaScript中,有多种获取当前窗口URL地址的方法,其中最常见的有window.location.href、location.href、parent.location.href和t…

    JavaScript 2023年6月11日
    00
  • Javascript Array length 方法

    以下是关于JavaScript Array length方法的完整攻略。 JavaScript Array length方法 JavaScript Array length方法用于获取或设置数组的长度。该方法返回数组中元素的数量,或者设置数组的长度。如果设置的长度小于当前数组的长度,则数组将被截断。如果设置的长度大于当前数组的长度,则数组将被扩展,并且新的元…

    JavaScript 2023年5月11日
    00
  • 使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)

    下面是使用原生JS封装Web App滑动效果(惯性滑动、滑动回弹)的攻略: 1. 问题背景 在开发Web APP时,我们会涉及到页面的滑动效果,例如图片浏览、列表滑动等。虽然很多UI框架(如iView、Element UI等)都提供了比较方便的组件,但是自己手写滑动效果,既能提升自己的技能水平,又能优化页面性能。 2. 实现思路 实现惯性滑动,需要监听tou…

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