javascript 匿名函数与闭包

STM32C5开发入门:环境搭建、点灯、串口与中断实战指南 在嵌入式开发中,基于Cortex-M架构的32位微控制器以其高主频、丰富外设和友好价格成为主流。掌握时钟树、GPIO复用等基础概念,是驱动外设的前提;而串口调试作为高效观测手段,配合中断与定时器机制,可实现非阻塞任务调度。这类技术广泛应用于工业控制、智能传感器、家电交互等场景,底层驱动的规范性直接影响固件稳定性。围绕STM32C5这颗典型芯片,从搭建开发环境、实现GPIO点灯、重定向printf到中断定时器排错,整理一条完整的入门实践路径,帮助开发者避开常见坑点,快速建立工程化调试思维。 阅读详情

匿名函数

普通函数:

function box(){
    return 'Lee';
}
alert(box());

匿名函数:

//单独的匿名函数  会报错    无法运行    也无法调用
//function() {
//  return 'Lee';
//}

//通过表达式的自我执行
(function() {
    alert('Lee');
})();

//把匿名函数赋值给变量
var cat = function() {
    return 'Lee';
};
alert(cat()); //调用

//把匿名函数自我执行的返回值赋值给变量
var box = (function() {
    return 'Lee';
})();
alert(box);
//自我执行匿名函数的传参
(function (num){
    alert(num);
})(100);

闭包

闭包指有权访问另一个函数作用域里变量的函数

//函数里放一个匿名函数---闭包
function box (){
    return function(){
        return 'Lee';
    }
}
alert(box); //function box(){return function(){return 'Lee'}}
alert(box());//function (){return 'Lee'}
alert(box()());//Lee

创建闭包的常见方式:

在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量

//通过全局变量来累加
var age=100;
function box(){
    age++;
    alert("age:"+age);
}
box();
alert(age);//101
//通过闭包返回局部变量
function box(){
    var age=100;
    return function(){
        return age;
    }
}
alert(box()());

使用闭包的优点(缺点),可以把局部变量驻留在内存中,避免使用全局变量(全局变量污染导致应用程序不可预测性,每个模块都可调用容易发生错误,所以推荐使用私有的,封装的局部变量)

//使用局部变量无法累加
function box(){
    age=100;
    age++;
    return age;
}
alert(age);//100
box();
alert(age);//100
//使用匿名函数实现局部变量驻留内存中,实现累加
function box(){
    var age=100;
    return function (){
        age++;
        return age;
    }
}
var b = box();
alert(b());//101
alert(b());//102
b=null;//接触引用,等待垃圾回收

由于闭包里作用域返回的局部变量资源不会被立刻撤销回收,所以可能会占用过多内存,过度使用将导致性能下降,建议在必要时才使用

循环里包含匿名函数

作用域链的机制导致了一个问题,在循环里的匿名函数取得的任何变量都是最后一个值

function box(){
    var arr = [];
    for(var i=0;i<5;i++){
        arr[i]=function(){
            return i;
        }
    }
    //循环已经执行完毕了,i最终为4++即5
    return arr;
}
var b=box();
for(var i=0;i<b.length;i++){
    alert(b[i]());
}
//5 5 5 5 5
//解决方法,单纯得到0 1 2 3 4  ---->无需使用匿名函数
function box(){
    var arr = [];
    for(var i=0;i<5;i++){
        arr[i]=i;
    }
    return arr;
}
for(var i=0;i<5;i++){
    alert(box()[i]);
}

//通过匿名函数及时自我执行
function box() {
var arr = [];
    for(var i = 0; i < 5; i++) {
        arr[i] = (function(num) {
            return num;
        })(i);
    }
    return arr;
}
var b = box();
for(var i = 0; i < b.length; i++) {
    alert(b[i]);
}
//通过闭包可以将变量驻留内存中
function box() {
var arr = [];
    for(var i = 0; i < 5; i++) {
        arr[i] = (function(num) {
            return function(){
                return num;
            };
        })(i);
    }
    return arr;
}
var b = box();
for(var i = 0; i < b.length; i++) {
    alert(b[i]);
}

关于this对象

this对象是在运行时基于函数的执行环境绑定的,如果this在全局范围就是window,如果是在对象内部,就指向这个对象,而闭包却是在运行时指向window的,因而闭包不属于这个对象的属性或方法。

var user="The window";
var box = {
    user:'The box',
    getUser:function(){
        return this.user;
    }
}
alert(user);//The window
alert(box.getUser());//The box

var user = "The window";
var box = {
    user: 'The box',
    getUser: function() {
        return function(){
            return this.user;
        }
    }
}
alert(box.getUser()()); //The window
alert(box.getUser().call(box)); //The box

内存泄漏

function box(){
    var oDiv = document.getElementById('oDiv');//oDiv用完后一直存在内存中
    var text =oDiv.innerHTML;
    oDiv.onclick=function(){
        alert(text);
    }
    oDiv=null;//解除引用,等待回收
}
box();

匿名函数中的私有化

封装细节,提高安全性和可控性,经常在全局作用域中被用于函数外部,从而限制向全局作用域中添加过多的变量和函数。
在全局作用域中使用块级作用域可以减少闭包占用内存的问题,因为没有指向匿名函数的引用,只要函数执行完毕,就可以立即销毁其作用域链了。

模仿块级(私有)作用域:

function box(){
    for(var i=0;i<5;i++){  //块级作用域(js无)
    }
    var i //即便重新声明,也不会影响之前的值
    alert(i);//5
}
box();

javascript 不同于java,c等其他语言,它没有块级语句的作用域,它不会提醒你多次声明同一次变量.因此可通过模仿块级作用域解决该问题。

function box(){
    (function(){
        for(var i=0;i<5;i++){  //块级作用域(js无)
        }
    })();
    alert(i);//报错
}
box();

私有作用域:

//全局变量
var age;
age=100;
age=null;
//太繁琐,没有封装性

(function(){
    //这里就是全局的私有作用域
    var age=100;
    alert(age);
})();

私有变量
javascript中没有私有属性的概念,所有的对象属性都是公有的,不过有私有变量的概念。任何在函数中定义的变量,都可以被认为是私有变量,因为不能在函数的外部访问这些变量。

function box(){
    var age=100;//私有变量,外部无法访问
}
//通过函数内部创建一个闭包,那么闭包通过自己的作用域链也可以访问这些变量,而利用这一点,也可以创建用于访问私有变量的共有方法
function Box(){
        this.age=100;//共有属性,外部可直接访问
        this.run=function(){//共有方法
            return 'running...';
        }
}
var box = new Box();
alert(box.age);//100
alert(box.run());//running
/*
function Box(){
    var age=100;//私有变量
    function run(){//私有方法
        return "running...";
    }
}
var box = new Box();
alert(box.run());//报错
*/

//解决方法:
function Box(){
    var age=100;//私有变量
    function run(){//私有方法
        return "running...";
    }
    this.getRun= function(){//对外可见的公共接口,特权方法
        return run();
    }
    this.getAge=function(){
        return age;
    }
}
var box = new Box();
alert(box.getRun());//running
alert(box.getAge());//100

通过构造函数传参

function Box(value) {
var user = value; //私有变量
    this.getUser = function() {
        return user;
    }
}
var box1 = new Box('Lee');
alert(box1.getUser());//Lee
var box2 = new Box('MJG');
alert(box2.getUser());//MJG
//没有共享

静态私有变量

//使用property导致方法共享,而user也变成了静态属性(共享于不同对象中的属性)
(function() {
    var user = ""; //私有变量
    Box = function(value) {
        user = value;
    }
    Box.prototype.getUser = function() {
        return user;
    }
    Box.prototype.setUser = function(value) {
        user = value;
    }
})();
var box1 = new Box('Lee');
alert(box1.getUser());//Lee
var box2 = new Box('kkk');
alert(box1.getUser());//kkk
box2.setUser('OOO');
alert(box1.getUser());//OOO

模块模式

//单例:永远只实例化一次   ----->字面量方式实例化对象
var box = function(){
    var user='Lee';//私有变量
    function run(){//私有函数
        return " running...";
    }
    return {//直接返回一个对象
        publicGo:function(){
            return user+run();
        }
    }
}();//自我执行的函数
alert(box.publicGo());//Lee running

增强的模块模式:

function Desk() {};
var box = function() {
    var user = 'Lee';

    function run() {
        return ' running';
    }
    var desk = new Desk();
    desk.publicGo = function() {
        return user + run();
    }
    return desk;
}();
alert(box.publicGo());
【学习系列】SAP RAP 16:RAP应用部署集成至Fiori Launchpad 【On-Premise】 本文详细介绍了如何将开发完成的RAP应用部署到S4HANA 2023 On-Premise环境并集成到Fiori Launchpad的完整流程。主要内容包括:1)通过ADT工具创建Fiori项目并配置外部IDE(VSCode);2)使用npm命令部署应用到系统;3)通过事务代码创建语义对象、磁贴目录和目标映射;4)配置PFCG角色分配;5)补充了部署失败解决方案、翻译问题处理、自定义主题设置以及登录页面LOGO修改等内容。文章提供了step-by-step的操作指南,帮助开发者将预览模式的应用正式部署到生产 阅读详情

相关推荐

【Labview】对连续采集数据的一种采样方法

图1如图1,想要对这样一个连续信号进行数据点的采集,我根据网上收集到的方法,在此分享一下最终的结果。可以拓展结合文件的写入,完成对连续信号的采集和输出。 已知: 一个连续信号,如图1. 目标: 设定一定采集点个数、采集点时间间隔、和采集周期次数,得到这条连续信号的数据点,如图2. 图2 方法如下: 主要利用的是队列的方法。 在连续信号生成的时候,不断的写入队列,并且清除队列。 ...

李时珍食疗志的博客 1万+

JS学习笔记(十一)什么是闭包?闭包和匿名函数的区别

什么是闭包?闭包和匿名函数的区别

Yeee_F 579

视觉机器人抓取实战:从物体定位到抓取估计的完整流程解析(附Python代码示例)

本文详细解析了视觉引导机器人抓取的完整技术流程,涵盖从物体定位、位姿估计到抓取估计的核心步骤。通过Python代码示例,演示了如何使用Open3D等工具进行点云处理、平面分割、PCA与ICP位姿估计,以及基于几何启发式的抓取生成方法,为机器人视觉抓取开发提供了清晰的实战指南。

peach的博客 913

[从jQuery看JavaScript]-匿名函数与闭包(Anonymous Function and Closure)

 jQuery片段:(function(){//这里忽略jQuery所有实现})();   半年前初次接触jQuery的时候,我也像其他人一样很兴奋地想看看源码是什么样的。然而,在看到源码的第一眼,我就迷糊了。为什么只有一个匿名函数又没看到运行(当然是运行了……),就能有jQuery这么个函数库了?于是,我抱着疑问来到优快云。结果相信现在很多人都很清楚了(因为在我之后也不乏来者,

natineprince的专栏 3万+

GmSSL国密双证书实战:从生成到Nginx配置全流程

本文详细介绍了使用GmSSL工具生成国密双证书(签名证书与加密证书)并配置Nginx支持国密HTTPS(TLCP协议)的全流程。内容涵盖环境准备、自签CA创建、服务器双证书生成、Nginx单向/双向认证配置以及兼容性处理,为部署符合国密标准的HTTPS服务提供实战指南。

weixin_29276847的博客 479

HIL(硬件在环)技术汇总梳理

HIL(Hardware-in-the-Loop)测试领域的知名公司有dSPACE、NI、Vector和speedgoat等,本文是针对这几家HIL技术的对比分析。

Mr.Cssust的博客 3687

JavaScript中的匿名函数以及闭包

JavaScript中的匿名函数以及闭包 匿名函数:匿名函数,也叫自执行的函数。从字面上就可以直接看出匿名函数是不需要通过调用来执行函数,在页面运行时,匿名函数也会自己运行起来。 作用:各自的代码都写在匿名函数中,并通过()立即执行,根据变量的作用域,可以达到保护变量的作用。 <script> (function (a) { alert(a); })(2);//2 (function(){ //A工程师的代码 var a =

weixin_44691513的博客 378

准备生日礼物

摘要: 题目要求统计某月份需要准备的员工生日礼物数量。输入包括目标月份、员工姓名列表和对应的生日列表(格式为Year/Month/Day)。需处理重复员工(以最后一次录入为准),统计该月生日的员工人数。示例1中5月有3名员工生日,输出3;示例2中10月有6名,输出6。解题关键在于使用哈希表去重(以员工姓名为键),拆分生日字符串提取月份进行匹配。代码实现(C++/Java/Python)均遵循以下步骤:读取输入、哈希去重、解析月份并统计目标月份人数。时间复杂度为O(n),空间复杂度O(n)。

面试高手的博客 298

javascript深入了解匿名函数和闭包

1、匿名函数 2、闭包 3、举例 4、注意 1、匿名函数 函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途。匿名函数:就是没有函数名的函数。 1.1 函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式 第一种:这也是最常规的一种 function double(x){ return 2 * x; }

我的博客 1557

基于 Qt C++ 的智能工厂数字孪生系统

你想要实现一个基于 Qt C++ 的智能工厂数字孪生系统,核心是 **Qt 3D** 场景搭建 + **实时数据驱动** 设备模型。下面我将为你提供一个完整的解决方案,包含 **核心思路、实现步骤、完整代码示例** 和 **注意事项**。| **渲染层** | 3D 场景搭建、设备模型加载、实时动画渲染、用户交互。| **业务逻辑层** | 数据处理(滤波、转换)、设备状态管理、动画逻辑控制。| **数据层** | 实时采集设备数据(如传感器、PLC、MES 系统),提供数据接口。

寒寒豆豆软件公司的博客 193

人工智能数据治理——解读AI时代数据治理白皮书 2025【附全文阅读】

摘要:该白皮书面向企业数字化负责人及AI项目推进人员,探讨AI时代数据治理的战略升级。提出"好数据+好数据知识"双基石理念,强调数据需满足"三高"标准(高精度、一致性、时效性)并构建语义知识库。构建四层治理框架,包括数据采集处理、合规安全、知识库建设及质量改进,并介绍AI赋能治理的新范式,如智能ETL和治理Agent体系。同时分析"软件+AI+好数据"的应用模式,为企业实现智能数据治理提供实践指导。(149字)

cdfunlove的博客 633

JS--JavaScript函数(匿名函数、闭包函数等)详解

JavaScript函数 JavaScript是函数式编程语言,在JavaScript脚本种可以随处看到函数,函数构成了JavaScript源码的主体。 定义函数 定义函数的方法有两种: 使用function语句声明函数 //方式一:命名函数 function f(){ //函数体 } //方式二:匿名函数 var f = function(){ //函数体 } 命名函数的方法也被称为...

吴声子夜歌的博客 2374

Spring AI 项目实战(十八):Spring Boot + AI + Vue3 + OSS + DashScope 实现高效语音识别系统(附完整源码)

本文介绍基于 Spring Boot AI 集成阿里云 OSS 与 DashScope 语音识别 API 的高效语音识别系统。该系统通过云端存储音频文件,解决传统本地存储的性能瓶颈与存储压力,支持同步 / 异步语音转文本,实现文件自动生命周期管理。文中详述技术选型、架构设计、核心代码实现(含前后端及配置)、部署流程,展现其高并发处理、可靠文件管理能力,适用于客服、教育等企业级场景,为语音识别应用提供实用解决方案。

博客 1537

JavaScript 匿名函数和闭包

JavaScript 匿名函数和闭包   匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数。声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂 .(所需基础 15 章的时候已经声明过了)。 匿名函数 //普通函数 function test() { // 函数名是test return 'strive_or_die'; } //匿名函数 function ()...

莫负时光 603

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【JavaScript】闭包和匿名函数的关系详解

文章目录前言匿名函数立即执行函数闭包结论 前言 本文讲的是关于JavaScript闭包和匿名函数两者之间的关系,从匿名函数概念到立即执行函数,最后到闭包。下面一起来看看文章分析,希望你会喜欢。 前面讲了一篇在for循环中加setTimeout输出内容,我们用到了一个闭包,但同时也可以说是匿名函数,到底匿名函数和闭包有没有关系呢? 【答案是它们之间没有关系】 匿名函数 匿名函数,顾名思义,就是没有名字的函数,与之对应的就是有名字的函数,也叫具名函数。 //匿名函数 function (){ conso

锦瑟年华,逐梦之人 880

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Javascript 匿名函数与闭包

Javascript 匿名函数与闭包一、函数的几种定义1、函数关键字(function) 语句      function func1(){         alert("func1");      }      func1();2、函数直接量(Function Literals)      varfunc2 = function(){         alert("func2");      }      func2();虽然函数直接量创建的是未命名函数

JeamKing的专栏 2331

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

js 匿名函数和闭包

匿名函数和闭包 转https://www.cnblogs.com/xiaowie/p/10277483.html填写了注释 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数。声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂。 // //普通函数 // function box(){ // return 'lee'; // }; // //匿名函数 // function(){ //执行的时候会显示错误 //..

bjgfs的专栏 439

JavaScript匿名函数和闭包

概述 在JavaScript前端开发中,函数与对其状态即词法环境(lexical environment)的引用共同构成闭包(closure)。也就是说,闭包可以让你从内部函数访问外部函数作用域。在JavaScript,函数在每次创建时生成闭包。匿名函数和闭包可以放在一起学习,可以加深理解。本文主要通过一些简单的小例子,简述匿名函数和闭包的常见用法,仅供学习分享使用,如有不足之处,还请指正。 普通函数 普通函数由fucntion关键字,函数名,() 和一对{} 组成,如下所示: function

绳锯木断,水滴石穿,专心写文,无问西东!!! 519

JavaScript闭包和匿名函数的关系详解

**摘要:**本文讲的是关于JavaScript闭包和匿名函数两者之间的关系,从匿名函数概念到立即执行函数,最后到闭包。下面一起来看看文章分析,希望你会喜欢。 前面讲了一篇在for循环中加setTimeout输出内容,我们用到了一个闭包,但同时也可以说是匿名函数,到底匿名函数和闭包有没有关系呢? 【答案是它们之间没有关系】 匿名函数 匿名函数,顾名思义,就是没有名字的函数,与之对应的就是有名字的函数,也叫具名函数。 //匿名函数 function (){ console.log('匿名函数'); }

Schaffer的博客 381

【JavaScript】——匿名函数和闭包

前提 通过最近一段时间对JavaScript视频的学习,接触到一种新的函数——匿名函数,也是通过对新鲜事物的学习,进而接触到新的一个名词——闭包。首先还是从基础的匿名函数开始谈起。 一、匿名函数 匿名函数就是没有名字的函数,而闭包就是访问一个函数作用域里变量的函数。 一个小de...

chouxian0781的博客 176

js匿名函数和闭包总结

js匿名函数和闭包总结 一、总结 一句话总结:匿名函数的最主要作用是创建闭包,闭包就是将函数内部和函数外部连接起来的一座桥梁。内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕。闭包可以用来模仿块级作用域等等。 匿名函数 闭包:匿名函数的最主要作用是创建闭包,闭包就是将函数内部和函数外部连接起来的一座桥梁。内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕。闭包可以用...

weixin_34054931的博客 258

JavaScript闭包与匿名函数

A friend of mine and I are currently discussing what is a closure in JS and what isn't. 我的一个朋友和我正在讨

xfxf996的博客 175

JavaScript-匿名函数、闭包

文章目录匿名函数闭包 匿名函数 没有函数名的函数称为匿名函数 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script> /*匿名函数的表示方法 (function(形参) { ...

paku-san的博客 259
上一篇: javascript 面向对象
下一篇: Bootstrap 环境安装
flowser
博客等级 码龄11年 37粉丝 119原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值