广告
返回顶部
首页 > 资讯 > 精选 >Javascript闭包使用场景的原理分析
  • 658
分享到

Javascript闭包使用场景的原理分析

2023-06-25 14:06:01 658人浏览 八月长安
摘要

这篇文章给大家分享的是有关javascript闭包使用场景的原理分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、闭包Javascript中,只有函数内部的子函数才能读取局部变量,闭包就是能够读取其他函数内部

这篇文章给大家分享的是有关javascript闭包使用场景的原理分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

一、闭包

Javascript中,只有函数内部的子函数才能读取局部变量,闭包就是能够读取其他函数内部变量的函数。

比如下面的代码:

function f1() {    var n = 999;    function f2() {    console.log(n);    }    return f2;}var result = f1();result();//999

  函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。

  这就是Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

  既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,就可以在f1外部读取它的内部变量了。

二、闭包的使用场景

1.setTimeout

  原生的setTimeout传递的第一个函数不能带参数,通过闭包可以实现传参效果。

function f1(a) {    function f2() {        console.log(a);    }    return f2;}var fun = f1(1);setTimeout(fun,1000);//一秒之后打印出1

2.回调

  定义行为,然后把它关联到某个用户事件上(点击或者按键)。代码通常会作为一个回调(事件触发时调用的函数)绑定到事件。

  比如下面这段代码:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>测试</title></head><body>    <a href="#" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  id="size-12">12</a>    <a href="#" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  id="size-20">20</a>    <a href="#" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  id="size-30">30</a>    <script type="text/javascript">        function changeSize(size){            return function(){                document.body.style.fontSize = size + 'px';            };        }        var size12 = changeSize(12);        var size14 = changeSize(20);        var size16 = changeSize(30);        document.getElementById('size-12').onclick = size12;        document.getElementById('size-20').onclick = size14;        document.getElementById('size-30').onclick = size16;    </script></body></html>

当点击数字时,字体也会变成相应的大小。

3.函数防抖

   在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。

   实现的关键就在于setTimeOut这个函数,由于还需要一个变量来保存计时,考虑维护全局纯净,可以借助闭包来实现。

   如下代码所示:

function debounce(fn,delay){    let timer = null    //借助闭包    return function() {        if(timer){            clearTimeout(timer) //进入该分支语句,说明当前正在一个计时过程中,并且又触发了相同事件。所以要取消当前的计时,重新开始计时            timer = setTimeOut(fn,delay)         }else{            timer = setTimeOut(fn,delay) // 进入该分支说明当前并没有在计时,那么就开始一个计时        }    }}

4.封装私有变量

  如下面代码:js创建一个计数器

  方法1:

function f1() {    var sum = 0;    var obj = {       inc:function () {           sum++;           return sum;       }};    return obj;}let result = f1();console.log(result.inc());//1console.log(result.inc());//2console.log(result.inc());//3

  在返回的对象中,实现了一个闭包,该闭包携带了局部变量x,并且,从外部代码根本无法访问到变量x。

  方法2:

function f1() {    var sum = 0;    function f2() {        sum++;        return f2;    }    f2.valueOf = function () {        return sum;    };    f2.toString = function () {        return sum+'';    };    return f2;}//执行函数f1,返回的是函数f2console.log(+f1());//0console.log(+f1()())//1console.log(+f1()()())//2

所有js数据类型都拥有valueOftoString这两个方法,null除外

  • valueOf()方法:返回指定对象的原始值。

  •  toString()方法:返回对象的字符串表示。

在数值运算中,优先调用了valueOf,字符串运算中,优先调用toString
   sum+' '是一个字符串类型的数据

感谢各位的阅读!关于“Javascript闭包使用场景的原理分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: Javascript闭包使用场景的原理分析

本文链接: https://www.lsjlt.com/news/305341.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Javascript闭包使用场景的原理分析
    这篇文章给大家分享的是有关Javascript闭包使用场景的原理分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、闭包Javascript中,只有函数内部的子函数才能读取局部变量,闭包就是能够读取其他函数内部...
    99+
    2023-06-25
  • Javascript闭包使用场景原理详细
    目录一、闭包二、闭包的使用场景1.setTimeout2.回调3.函数防抖4.封装私有变量 一、闭包 Javascript中,只有函数内部的子函数才能读取局部变量,闭包就是能够读取其...
    99+
    2022-11-12
  • JavaScript闭包原理及作用的示例分析
    小编给大家分享一下JavaScript闭包原理及作用的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!简介说明本文介绍JavaScript的闭包的作用、用途及其原理。闭包的定义闭包是指内部函数总是可以访问其所在的外部...
    99+
    2023-06-22
  • Javascript闭包的作用和应用场景
    本篇内容介绍了“Javascript闭包的作用和应用场景”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、...
    99+
    2022-10-19
  • JavaScript解析机制与闭包原理的示例分析
    小编给大家分享一下JavaScript解析机制与闭包原理的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:js解...
    99+
    2022-10-19
  • Go中sync 包Cond使用场景分析
    目录背景Cond 简介使用示例Signal的使用场景Broadcast的使用场景注意事项背景 编写代码过程中, 通常有主协程和多个子协程进行协作的过程,比如通过 WaitGroup ...
    99+
    2023-03-03
    Go 使用 sync.cond go sync包cond使用
  • ThreadLocal原理分析及应用场景是怎样的
    本篇文章给大家分享的是有关ThreadLocal原理分析及应用场景是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. ThreadLocal是什么?有哪些用途?首先介绍...
    99+
    2023-06-22
  • JavaScript闭包原理与使用介绍
    目录1. 认识闭包2. 变量的作用域和生命周期2.1 变量的作用域2.2 变量的生命周期3. 闭包的概念及其作用3.1 闭包的概念3.2 闭包的应用3.2.1 保存私有变量3.2.2...
    99+
    2022-11-13
    JavaScript闭包 JS闭包
  • Mybatis-Plus的应用场景描述及注入SQL原理分析
    目录一、背景1.1 传统Mybatis的弊端1.2 MyBatis-Plus的定位1.3 特性1.4 原理解析二、准备工作2.1 基础接口BaseMapper2.2 创建实体类对象2...
    99+
    2022-11-12
  • Java ThreadLocal原理解析以及应用场景分析案例详解
    目录ThreadLocal的定义ThreadLocal的应用场景ThreadLocal的demoTheadLocal的源码解析ThreadLocal的set方法ThreadLocal...
    99+
    2022-11-12
  • Docker中Dockerfile多阶段构建原理及使用场景的示例分析
    小编给大家分享一下Docker中Dockerfile多阶段构建原理及使用场景的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!老版本Docker中为什么不支持多个 FROM 指令在17.05版本之前的Docker,只...
    99+
    2023-06-04
  • Javascript实用方法之json合并的场景分析
    场景 2个json合并, jQuery 的“extend()”方法有两个原型:合并的方法,分别是浅合并和深度合并,其实浅合并只是json的第一层被合并,而深度...
    99+
    2022-11-13
  • Vue中$set()的使用方法场景分析
    目录Vue中$set()的使用方法前言$set()的应用场景一$set()的应用场景二补充:vue中$set的用法$set用于更新数组:$set用于更新对象:Vue中$set()的使...
    99+
    2023-02-18
    Vue中$set()使用 Vue中$set()用法 Vue中$set()
  • Go语言基础闭包的原理分析示例详解
    目录一. 闭包概述二. 代码演示运行结果代码说明一. 闭包概述 闭包就是解决局部变量不能被外部访问的一种解决方案 闭包是把函数当作返回值的一种应用 二. 代码演示...
    99+
    2022-11-12
  • ThreadLocal的原理和使用场景是什么
    ThreadLocal是Java中的一个类,用于在多线程环境中实现线程内部的数据共享。它提供了一个线程局部变量,每个线程都可以独立地...
    99+
    2023-09-12
    ThreadLocal
  • Go并发控制WaitGroup的使用场景分析
    1. 前言 上一篇介绍了 Go并发控制--Channel 使用channel来控制子协程的优点是实现简单,缺点是当需要大量创建协程时就需要有相同数量的channel,而且对于子协程继...
    99+
    2022-11-12
  • Javascript闭包的作用与使用方法浅析
    目录一、变量的作用域二、如何从外部读取局部变量js 闭包(closure)是Javascript语言的一个难点,也是它的特色。 闭包的作用:通过一系方法,将函数内部的变量(局部变量)...
    99+
    2023-01-18
    JavaScript闭包 JS闭包
  • Javascript之作用域、作用域链、闭包的示例分析
    这篇文章主要介绍Javascript之作用域、作用域链、闭包的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是作用域?作用域是一种规则,在代码编译阶段就确定了,规定了变量...
    99+
    2022-10-19
  • go select编译期的优化处理逻辑使用场景分析
    前言 select作为Go chan通信的重要监听工具,有着很广泛的使用场景。select的使用主要是搭配通信case使用,表面上看,只是简单的select及case搭配,实际上根据...
    99+
    2022-11-12
  • JavaScript中闭包的概念、原理及作用是什么
    本篇内容主要讲解“JavaScript中闭包的概念、原理及作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript中闭包的概念、原理及作用是...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作