JavaScript 闭包机制详解及实例代码

yizhihongxing

JavaScript 闭包机制详解及实例代码

什么是闭包

在JavaScript中,闭包(closure)是一种非常重要的概念。简单来说,闭包是指可以访问自由变量的函数。函数可以访问定义在它外部作用域内的变量。

闭包的基本形式

在一个函数内部,创建一个内部函数,内部函数可以访问外部函数的变量。这个内部函数就是闭包。

示例代码如下:

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

var fn = outer();
fn(); // 输出结果为: 10

在这个例子中,内部函数inner可以访问外部函数outer的变量a,这个变量a就是自由变量。

闭包的用途

闭包有很多用途,下面列举了几个常见的用途。

封装变量

使用闭包来封装一个变量,可以避免变量被外部修改。

示例代码如下:

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

var c = counter();
c(); // 输出结果为: 1
c(); // 输出结果为: 2
c(); // 输出结果为: 3

在这个例子中,使用闭包来封装了一个变量count,防止外部修改它的值。同时,在内部函数中可以修改它的值,并在每次调用时打印出来。

防抖和节流

使用闭包可以实现防抖和节流的功能。

防抖

在一段时间内多次触发一个事件,只执行最后一次,可以使用闭包来实现防抖的功能。

示例代码如下:

function debounce(fn, delay) {
  var timer = null;
  return function() {
    var that = this;
    var args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function() {
      fn.apply(that, args);
    }, delay);
  }
}

function handleClick(e) {
  console.log(e.target.innerHTML);
}

var btn = document.getElementById('btn');
btn.addEventListener('click', debounce(handleClick, 1000));

在这个例子中,使用闭包来保存一个定时器对象timer,在事件触发时,清除之前的定时器,重新设置一个新的定时器,延迟执行handleClick函数。

节流

在一段时间内多次触发一个事件,每隔一定时间执行一次,可以使用闭包来实现节流的功能。

示例代码如下:

function throttle(fn, delay) {
  var timer = null;
  return function() {
    var that = this;
    var args = arguments;
    if (!timer) {
      timer = setTimeout(function() {
        fn.apply(that, args);
        timer = null;
      }, delay);
    }
  }
}

function handleScroll(e) {
  console.log(window.scrollY);
}

window.addEventListener('scroll', throttle(handleScroll, 1000));

在这个例子中,使用闭包来保存一个定时器对象timer,在第一次触发事件时,立即执行handleScroll函数,并设置一个定时器,在定时器时间到达前,不再执行handleScroll函数。定时器执行后,再次允许事件触发执行函数。

总结

本文介绍了JavaScript闭包的概念、基本形式以及常见用途。闭包是一种强大的功能,可以用来实现很多高级的编程技巧,需要在实际开发中多多使用和运用。

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

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

相关文章

  • Js利用console计算代码运行时间的方法示例

    当我们需要测试我们写的代码的运行时间以找到性能瓶颈时,可以使用JavaScript中的console对象来帮助我们计算代码运行的时间。下面是使用console计算代码运行时间的方法示例及其详细攻略: 显式地调用console.time()方法和console.timeEnd()方法 console.time()方法可以起到计时的作用,它需要传入一个唯一的标识…

    JavaScript 2023年5月27日
    00
  • 总结JavaScript中BigIn函数常见的属性

    下面是讲解总结JavaScript中BigIn函数常见属性的完整攻略。 1. BigInt函数的介绍 BigInt是JavaScript中的一个新特性,是一种全新的数字类型。BigInt类型可以表示任意大的整数,而不是限制在Number类型的最大安全整数范围内。BigInt类型使用类似整数的语法来表示,但需要在数字末尾添加一个n后缀。 2. BigInt函数…

    JavaScript 2023年5月28日
    00
  • 详解JavaScript基础知识(JSON、Function对象、原型、引用类型)

    下面我来详细讲解“详解JavaScript基础知识(JSON、Function对象、原型、引用类型)”的完整攻略。 JSON 什么是 JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输。它基于 JavaScript 对象结构,但是具有更严格的格式要求,在很多编程语言中也得到了支持。 JS…

    JavaScript 2023年5月27日
    00
  • JavaScript中直接写undefined的错误及用法剖析

    JavaScript中直接写undefined的错误及用法剖析 在JavaScript中,undefined是一个特殊的值,表示“未定义”的意思。然而,有时候我们会不小心直接写出了undefined,这可能会导致错误。本文将从浅入深地探讨这个问题,并给出一些示例。 常见错误 首先,我们来看看最常见的错误:直接写undefined。 function foo(…

    JavaScript 2023年5月18日
    00
  • 全面解析Bootstrap表单使用方法(表单按钮)

    Bootstrap是目前最为流行的前端UI框架之一,它内置了很多实用的组件,其中表单是必不可少的一个组件。在表单的使用中,表单按钮起着非常重要的作用,它可以帮助我们实现一些非常实用的功能,例如提交表单、删除数据等。 下面我将为大家详细讲解如何使用Bootstrap表单按钮。 一、表单按钮的基本用法 在使用Bootstrap表单按钮的时候,我们需要先引入Boo…

    JavaScript 2023年6月10日
    00
  • javascript正则表达式RegExp入门图文教程

    下面是关于“javascript正则表达式RegExp入门图文教程”的完整攻略。 一、什么是正则表达式? 正则表达式(regular expression),又称正规表示式、正规表示法、规则表示法、常规表示法(英语:Regular Expression,缩写:regex、regexp),是计算机科学的一个概念。正则表达式是一种用来匹配字符串的强有力的武器。对…

    JavaScript 2023年6月10日
    00
  • JavaScript时间戳与时间日期间相互转换

    下面我将详细讲解“JavaScript 时间戳与时间日期间相互转换”的完整攻略。 什么是时间戳? 时间戳是用于表示时间的一种方式,它是自1970年1月1日 00:00:00 UTC到当前时间的毫秒数。JavaScript只支持精确到毫秒级别的时间戳。 时间戳的好处是可以通过它来进行时间比较或计算时间差等操作,并且可以通过时间戳在不同的设备和系统之间进行时间的…

    JavaScript 2023年5月27日
    00
  • javascript面向对象的方式实现的弹出层效果代码

    JavaScript中面向对象编程(Object-Oriented Programming,简称OOP)是一种常见的编程方式,通过将数据属性和方法封装在对象中,实现了代码的复用性、可读性和可维护性。本文将从实现弹出层效果的角度,详细讲解如何使用JavaScript面向对象的方式实现弹出层效果的代码。 构建弹出层对象 首先,我们需要创建一个弹出层对象。这个对象…

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