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());
DSH-Work:一个让DeepSeek下载即用的Harness客户端 使用大模型工具时,环境配置往往比模型本身更让人头疼。DeepSeek Harness作为一类封装层,将模型调用、上下文管理、参数控制等复杂细节统一收拢,对外提供简洁操作入口。开源的DSH-Work正是这样一款Harness客户端,它通过自带运行时与保守默认配置,实现了下载即用、免配环境的目标,让使用者无需掌握Python、CUDA等专业知识即可快速连接DeepSeek云端或本地服务。对于非技术背景的用户,它降低了AI工具的使用门槛;对于开发者,它把时间从环境排错中解放出来,更专注于提示词调优与工作流设计。无 阅读详情

相关推荐

获取气体传感器温度调制响应数据并转换为NumPy数组

本任务旨在获取气体传感器在温度调制条件下的响应数据,将其处理为结构化数据格式(NumPy数组),以便用于机器学习模型训练。整个过程包含数据采集、预处理、特征工程和格式转换等关键步骤。

huanghm88的专栏 1207

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

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

Yeee_F 579

threekingdoms.txt中文三国演义下载及实现人物出场统计

threekingdoms.txt全文下载:https://python123.io/resources/pye/threekingdoms.txt CalThreeKingdomsV1.py: #CalThreeKingdomsV1.py import jieba txt = open("threekingdoms.txt", "r", encoding = "utf-8").read() words = jieba.lcut(txt) counts = {} for word in words:

ZYYRWish_97的博客 1万+

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

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

natineprince的专栏 3万+

HWSD全球土壤数据下载处理

下载地址: http://www.fao.org/soils-portal/soil-survey/soil-maps-and-databases/harmonized-world-soil-database-v12/en/

江北20190411的博客 3万+

Win10 IPv6 远程桌面连接(小米路由器)

背景 由于家里是移动网,且懒得向运营商要公网IPv4,所以想着用IPv6试一下。 家里的环境是这样的: 宽带用的是移动的,没有公网IPv4,但经过测试发现IPv6是公网的 上网通过光猫拨号,而不是通过路由器 路由器是小米AC2100 光猫更改为桥接模式 路由器必须要通过PPPoE拨号,如果是光猫拨号,那么要找对应的维护人员辅助你把光猫改成桥接模式。通过PPPoE拨号路由器就能够拿到公网的IPv6网段,也就可以给底下的其他服务分配公网IPv6了。而如果是光猫拨号,那么只有路由器可以拿到公网的IP。其他的设

timczm的博客 1万+

JavaScript中的匿名函数以及闭包

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

weixin_44691513的博客 378

接入 deepseek 实现AI智能问诊

必须包含user角色,用于传递用户输入。system角色可选,用于设置对话背景。多轮对话需要将历史记录添加到messages中。

weixin_51326478的博客 6541

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

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

我的博客 1557

编写用户帮助/操作手册指南

一个新系统,需要写用户操作手册,该从何下笔?本篇是一篇教你编写用户帮助/操作手册的指南~

pytester的博客 3万+

用一张分析型 CDS Query 看清争议案件新增与结案节奏:C_OpenClosedDisputeCase 深度解读

应收账款争议管理中的关键CDS视图分析 摘要:C_OpenClosedDisputeCase是SAP系统中用于监控应收账款争议案件的重要CDS视图,提供三个时间窗口(当日、近5天、当月)的新增与结案数据。该视图通过"创建vs解决"的净变化指标,帮助财务团队实时掌握争议管理趋势,特别适用于多币种跨国企业的现金流管理。其核心价值在于将争议管理从被动"救火"转变为可量化运营,通过统一汇率换算和关键日期参数,为管理层提供标准化的运营仪表盘。视图采用特权访问模式,需通过上层应用

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 122

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

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

吴声子夜歌的博客 2374

材料带隙预测(图神经网络)(⭐⭐)—— 用晶体图网络预测钙钛矿材料的能带隙,加速光伏材料筛选。技术栈:CGCNN、MEGNet、Materials Project数据集

钙钛矿太阳能电池以其高效率、低成本的优势迅速崛起,但传统“试错法”材料筛选效率极低,严重制约了光伏技术的迭代速度。近年来,基于图神经网络的材料带隙预测方法,特别是晶体图神经网络(CGCNN)和材料图网络(MEGNet),为这一问题提供了革命性的解决方案。本文系统梳理了材料带隙预测从传统计算到深度学习的演进历程,深入剖析了CGCNN与MEGNet的架构设计、数学原理及创新机制,详细阐述了Materials Project数据集的构建、特征工程与处理策略。

2201_76125393的博客 48

JavaScript 匿名函数和闭包

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

莫负时光 603

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

锦瑟年华,逐梦之人 880

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Javascript 匿名函数与闭包

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

JeamKing的专栏 2331

数学建模模型总结

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

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、付费专栏及课程。

余额充值