千家信息网

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

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章给大家分享的是有关Javascript闭包使用场景的原理分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、闭包Javascript中,只有函数内部的子函数才能读
千家信息网最后更新 2026年11月02日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.回调

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

  比如下面这段代码:

        测试    12    20    30    

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

3.函数防抖

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

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

   如下代码所示:

/** fn [function] 需要防抖的函数* delay [number] 毫秒,防抖期限值*/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数据类型都拥有valueOf和toString这两个方法,null除外

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

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

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

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

函数 变量 闭包 对象 代码 事件 局部 方法 场景 字符 字符串 就是 原理 分析 内容 分支 数据 更多 篇文章 类型 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 咖啡豆 互联网电商科技 互联网科技会 互联网巨头反垄断金融科技 互联网科技排名 丰台科技园 互联网 狮子座互联网科技培训 中国最先进互联网科技公司 剑昆互联网络科技有限公司临桂 宜昌元轩互联网科技有限公司 互联网在线教育科技创业 晋城互联网科技 朱啸虎曾投资哪些互联网科技企业 互联网金融科技元年 广州百诚互联网科技有限公司官网 互联网相关科技技术 互联网领先科技成果宣传视频 互联网科技自媒体灵感 知域互联网科技有限公司官网 前海云享互联网科技 互联网科技的 善班互联网科技 未来的互联网科技 奇酷互联网络科技公司 银川新华互联网科技职业技术培训学校图片 南山科技园互联网公司有哪些 米聚互联网科技南京有限公司排面 天津腾达互联网科技有限公司 合肥互联网科技公司公章图片 山东大美朱楼互联网科技有限公司
0