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

JavaScript中的匿名函数是什么? 匿名函数是JavaScript中一种没有名称的函数,可以直接调用、赋值给变量、作为参数传递,甚至可以作为对象的方法使用。通过灵活使用匿名函数,我们可以更好地组织和管理我们的代码。在JavaScript中,匿名函数是一种没有名称的函数。匿名函数在编程中非常有用,可以用于创建闭包、处理回调函数等多种情况。匿名函数可以直接调用,也可以赋值给变量或作为其他函数的参数传递。上述代码中,我们使用自执行函数的方式直接调用了一个匿名函数。在这个例子中,我们将一个匿名函数赋值给了变量。函数,并在函数内部调用该回调函数。 阅读详情

1、匿名函数

函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途。匿名函数:就是没有函数名的函数。

1.1 函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式

第一种:这也是最常规的一种

function double(x){
    return 2 * x;   
}

第二种:这种方法使用了Function构造函数,把参数列表和函数体都作为字符串,很不方便,不建议使用。

var double = new Function('x', 'return 2 * x;');

第三种:

var double = function(x) { return 2* x; }

注意“=”右边的函数就是一个匿名函数,创造完毕函数后,又将该函数赋给了变量square。

1.2 匿名函数的创建

第一种方式:就是上面所讲的定义square函数,这也是最常用的方式之一。

第二种方式:

(function(x, y){
    alert(x + y);  
})(2, 3);

这里创建了一个匿名函数(在第一个括号内),第二个括号用于调用该匿名函数,并传入参数。

2、闭包

闭包的英文单词是closure,这是JavaScript中非常重要的一部分知识,因为使用闭包可以大大减少我们的代码量,使我们的代码看上去更加清晰等等,总之功能十分强大。

闭包的含义:闭包说白了就是函数的嵌套,内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕(这点涉及JavaScript作用域链)。

示例一
function checkClosure(){
    var str = 'rain-man';
    setTimeout(
        function(){ alert(str); } //这是一个匿名函数
    , 2000);
}
checkClosure();

这个例子看上去十分的简单,仔细分析下它的执行过程还是有许多知识点的:checkClosure函数的执行是瞬间的(也许用时只是0.00001毫秒),在checkClosure的函数体内创建了一个变量str,在checkClosure执行完毕之后str并没有被释放,这是因为setTimeout内的匿名函数存在这对str的引用。待到2秒后函数体内的匿名函数被执行完毕,str才被释放。

示例二,优化代码
function forTimeout(x, y){
    alert(x + y);
}
function delay(x , y  , time){
    setTimeout('forTimeout(' +  x + ',' +  y + ')' , time);    
}
/**
 * 上面的delay函数十分难以阅读,也不容易编写,但如果使用闭包就可以让代码更加清晰
 * function delay(x , y , time){
 *     setTimeout(
 *         function(){
 *             forTimeout(x , y) 
 *         }          
 *     , time);   
 * }
 */

3、举例

匿名函数最大的用途是创建闭包(这是JavaScript语言的特性之一),并且还可以构建命名空间,以减少全局变量的使用。

示例三:
var oEvent = {};
(function(){ 
    var addEvent = function(){ /*代码的实现省略了*/ };
    function removeEvent(){}

    oEvent.addEvent = addEvent;
    oEvent.removeEvent = removeEvent;
})();

在这段代码中函数addEvent和removeEvent都是局部变量,但我们可以通过全局变量oEvent使用它,这就大大减少了全局变量的使用,增强了网页的安全性。 我们要想使用此段代码:oEvent.addEvent(document.getElementById('box') , 'click' , function(){});

示例四:
var rainman = (function(x , y){
    return x + y;
})(2 , 3);
/**
 * 也可以写成下面的形式,因为第一个括号只是帮助我们阅读,但是不推荐使用下面这种书写格式。
 * var rainman = function(x , y){
 *    return x + y;
 * }(2 , 3);
 */

在这里我们创建了一个变量rainman,并通过直接调用匿名函数初始化为5,这种小技巧有时十分实用。

示例五:
var outer = null;

(function(){
    var one = 1;
    function inner (){
        one += 1;
        alert(one);
    }
    outer = inner;
})();

outer();    //2
outer();    //3
outer();    //4

这段代码中的变量one是一个局部变量(因为它被定义在一个函数之内),因此外部是不可以访问的。但是这里我们创建了inner函数,inner函数是可以访问变量one的;又将全局变量outer引用了inner,所以三次调用outer会弹出递增的结果。

4、注意

4.1 闭包允许内层函数引用父函数中的变量,但是该变量是最终值

示例六:

/**
 * <body>
 * <ul>
 *     <li>one</li>
 *     <li>two</li>
 *     <li>three</li>
 *     <li>one</li>
 * </ul>
 */

var lists = document.getElementsByTagName('li');
for(var i = 0 , len = lists.length ; i < len ; i++){
    lists[ i ].onmouseover = function(){
        alert(i);    
    };
}

你会发现当鼠标移过每一个<li&rt;元素时,总是弹出4,而不是我们期待的元素下标。这是为什么呢?注意事项里已经讲了(最终值)。显然这种解释过于简单,当mouseover事件调用监听函数时,首先在匿名函数( function(){ alert(i); })内部查找是否定义了 i,结果是没有定义;因此它会向上查找,查找结果是已经定义了,并且i的值是4(循环后的i值);所以,最终每次弹出的都是4。

解决方法一:

var lists = document.getElementsByTagName('li');
for(var i = 0 , len = lists.length ; i < len ; i++){
    (function(index){
        lists[ index ].onmouseover = function(){
            alert(index);    
        };                    
    })(i);
}

解决方法二:

var lists = document.getElementsByTagName('li');
for(var i = 0, len = lists.length; i < len; i++){
    lists[ i ].$$index = i;    //通过在Dom元素上绑定$$index属性记录下标
    lists[ i ].onmouseover = function(){
        alert(this.$$index);    
    };
}

解决方法三:

function eventListener(list, index){
    list.onmouseover = function(){
        alert(index);
    };
}
var lists = document.getElementsByTagName('li');
for(var i = 0 , len = lists.length ; i < len ; i++){
    eventListener(lists[ i ] , i);
}
4.2 内存泄露

使用闭包十分容易造成浏览器的内存泄露,严重情况下会是浏览器挂死,感兴趣的的话可以参考:http://www.cnblogs.com/rainman/archive/2009/03/07/1405624.html。


转载于:http://www.cnblogs.com/rainman/archive/2009/05/04/1448899.html

JavaScript泛型方法的实现和使用 总结起来,尽管JavaScript本身没有内置的泛型支持,但我们可以使用函数参数的灵活性或者使用泛型类来实现类似的功能。泛型方法是一种在编程中非常有用的技术,它允许我们在不指定具体类型的情况下编写通用的代码。这只是使用JavaScript实现泛型方法的两种常见方法,实际上还有其他的技术和库可以实现类似的功能。由于JavaScript中的数组是一种通用的数据结构,我们可以使用这个方法来反转任何类型的数组,无论是数字数组还是字符串数组。我们可以接收任意类型的参数,并在函数内部根据参数的类型执行相应的逻辑。 阅读详情

相关推荐

RK3588+TRL8367s四网口千兆交换机硬件调试与DTS配置实战

本文详细介绍了基于RK3588处理器与RTL8367S交换机芯片构建四网口千兆交换设备的硬件调试与DTS配置实战。文章深入对比了MDIO与SMI两种通讯方式的配置差异,提供了详尽的设备树代码示例,并总结了常见问题的排查思路,旨在帮助开发者高效完成嵌入式网络设备的软硬件集成与调试工作。

weixin_28308325的博客 468

js - 匿名函数和箭头函数理解

本文介绍了JavaScript中的匿名函数和箭头函数。匿名函数是没有名字的函数,需要通过自调用或赋值给变量使用,应用场景包括事件绑定、对象方法、回调函数等。箭头函数是ES6新增的语法,具有简洁的写法特点:单参数可省略括号,单返回语句可省略大括号和return。箭头函数没有自己的this,会继承父级作用域的this值。文章还对比了对象中不同函数写法的差异,包括省略键名、普通函数和匿名函数等写法。这些函数特性在实际开发中具有重要应用价值。

尽日寻春不见春,芒鞋踏遍陇头云。归来笑拈梅花嗅,春在枝头已十分。 5575

MIT Mini Cheetah--仿真流程

MIT Mini Cheetah–仿真 摘要 由于官方提供代码中,控制仿真环境中的猎豹机器人运动需要遥控器来控制。官方默认推荐使用logitech Gamepad F310游戏手柄:We use the Logitech F310 controller. There’s a switch in the back, which should be in the “X” position. The controller needs to reconnected if you change the switch

Galaxy_Robot的博客 5916

JavaScript-匿名函数

什么是匿名函数 1、匿名函数,即没有名称的函数 2、如果单独只写一个匿名函数,此时是不符合语法要求的 会报错。需要给 匿名函数包裹一个括号,使之成为表达式。 3、被小括号包裹的内容会被js识别为一个函数表达式 如何执行和使用匿名函数? 需要执行匿名函数 后面追加括号即可 也就是立即执行函数 方式一:小括号只将匿名函数包裹起来 后面跟随执行的小括号(常用) (function () { alert('匿名函数执行方式一') })(); 小括号将匿名函数以及执行匿名函数的小括号都包裹起来

weixin_45203607的博客 1万+

摄像头读取出现VIDIOC_STREAMON: No space left on device 错误

先说下原因,linux中为usb camera提供了一个标准的V4L2的驱动以方便使用,只要符合驱动规范就可以实现即插即用usb camera设备,即免驱动安装。 但市面上的USB 摄像头都是2.0的。usb bus的 bandwidth是有限的,而V4L2驱动采用的是贪心原则,即camera会要求获取最大带宽;因此将两个camera接入一路usb bus,打开第二个camera(尤其是采用YUV...

houge101的博客 9288

【windows】【系统还原】亦是美kms执行一键关闭defender 之后,windows defender 被卸载了,无论如何都打不开

还是执行 都没有明显效果 那么,我最后是怎么解决得呢? 一、打开控制面板(任务栏搜索kzmb)

weixin_41899098的博客 6905

JavaScript程序基础(十三)匿名函数

一、函数的定义 要把一段代码做成可重复使用的模块,需要掌握规定的格式: function 函数名([参数 1, 参数 2,……]){ 语句 [return 返回值] } 普通函数示例: function fn(x){ document.write(x + "<br />"); } fn("我爱学习JS"); 函数定义时,如果没有函数名,可以吗? 答案是可以,但是必须按特定格式。 没有名字的函数,叫匿名函数。 二、匿名函数 匿名函数的格式 匿名函数:有关键字 function,

授业中寻找乐趣 4131

uniapp - 实现手机端H5网页直播功能效果,拿到后端推流地址或播放资源后进行前端的流畅播放和画面展示功能,uniapp实时推流/拉流直播系统详细教程(提供完整示例代码,一键复制开箱即用!)

uniapp,h5网页,手机端H5网页,uniapp h5直播功能页面,uniapp直播实时推送显示,uniapp h5直播怎么做,怎么使用uniapp去实现移动端手机H5直播,h5 vue+uniapp怎么做直播,uniapp中使用videojs构建H5直播播放器,uniappH5端怎么实现直播推流,uniapp如何实现直播,直播聊天功能,h5平台端直播用什么插件,uniapp手机网页直播用什么组件插件播放器,uniapp手机H5直播播放器详细教程,直播项目,怎么使用vue+uniapp怎么做H5实时直播

✅ 精选推荐文章 8792

【JavaScript】深入了解JavaScript中的匿名函数、立即执行函数和闭包

深入了解JavaScript中的匿名函数、立即执行函数和闭包JS中函数两种命名方式:声明式和表达式匿名函数匿名函数作用:1.用作函数表达式2.作为返回值3.用作定义对象方法4.作为回调函数5.用于立即执行函数6.用于DOM元素注册事件立即执行函数立即执行函数形式1. 将匿名函数包裹在一个括号运算符中,后面再跟一个括号。2. 匿名函数后面跟一个括号,再将整个包裹在一个括号运算符中。立即函数的作用闭包经典案例分析闭包闭包特点闭包的创建闭包形式1.直接以匿名函数的形式作为外部函数的返回值(普遍用法)2.在外部函数

我没有头发的博客 1191

ArcGIS实验教程——实验二十五:大型商场选址经典案例

本实验基于ArcGIS平台进行商场选址分析,综合考虑道路、居民点、停车场和已有商场四个影响因素。通过缓冲区分析建立各要素的影响范围(道路50米、居民点100米、停车场100米、已有商场500米),采用叠加分析中的相交和擦除运算确定最优选址区域。实验建立了区位评价体系,通过属性赋值(1/-1)和联合运算生成综合评价结果,并实现分级可视化显示。注意事项包括距离参数设置对结果的影响以及正确选择空间分析工具。该流程为商业选址提供了科学的GIS解决方案。

智慧空间实验室 1万+

[Dify实战]插件编写- 如何让插件直接输出文件对象(支持 TXT、Excel 等)

本文介绍了在Dify插件中实现文件对象返回的方法。通过create_blob_message()函数,开发者可以输出txt、Excel等格式文件,让用户直接下载而非复制文本。文章详细讲解了二进制文件生成的原理,提供了文本翻译和Excel报表生成的代码示例,并列出常见MIME类型对照表。这种技术能显著提升插件实用性,特别适用于翻译、报表生成等需要文件输出的场景,使交互体验从"复制粘贴"升级为"一键下载"。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 1247

js中的匿名函数

定义:匿名函数顾名思义指的是没有名字的函数,在实际开发中使用的频率非常高!也是学好JS的重点。 匿名函数:没有实际名字的函数。 首先我们声明一个普通函数: //声明一个普通函数,函数的名字叫fn function fn(){ console.log("张培跃"); } 然后将函数的名字去掉即是匿名函数: //匿名函数,咦,运行时,你会发现报错啦! function (){ console.log("张培跃"); } 到此,你会发现单独运行一个匿名函数,由于不符合语法...

u011200562的博客 823

手把手教你学simulink(95.1)--PID控制实例:基于Simulink的PID控制温度控制系统建模与仿真

温度控制是工业自动化、家用电器、医疗设备以及航空航天等领域中常见的控制问题。通过精确的温度控制,可以提高生产效率、降低能耗并确保产品质量。PID(比例-积分-微分)控制器因其结构简单、性能稳定且易于实现而被广泛应用于各种温度控制系统。本项目旨在通过MATLAB/Simulink平台设计和验证一个基于PID控制的温度控制系统,重点研究PID参数调优方法、系统动态响应特性以及稳态误差消除能力。

MHD0815的博客 792

对JAVASCRIPT匿名函数的理解

网上很多解释,我无法理解,我想知道原理。。。这篇文章应该可以透彻一点 Query片段: view plaincopy to clipboardprint? (function(){ //这里忽略jQuery所有实现 })();   半年前初次接触jQuery的时候,我也像其他人一样很兴奋地想看看源码是什么样的。然而,在看到源码的第一眼,我就...

dny44433的博客 82

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

JavaScript进阶-闭包

学习闭包前需要掌握执行上下文相关知识! 闭包理解 代码上如何体现产生闭包? 调用外部函数(执行内部函数定义,不需要调用内部函数) 外部函数不调用的话内部函数无法定义(执行外部函数的时候才会创建内部函数对象,从而产生闭包) 外部函数执行几次就创建几个闭包 常见闭包 闭包的作用 闭包的生命周期 ...

浪里小白龙nbw的博客 243

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【JavaScript】一文了解JS的闭包

详解JavaScript的闭包使用及其日常开发遇到的常见问题

ztK63LrD的博客 4053

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

javascript 匿名函数与闭包

匿名函数普通函数:function box(){ return 'Lee'; } alert(box());匿名函数://单独的匿名函数 会报错 无法运行 也无法调用 //function() { // return 'Lee'; //}//通过表达式的自我执行 (function() { alert('Lee'); })();//把匿名函数赋值给变量 var cat

不要皱眉 4744

JavaScript匿名函数和闭包的区别

前言 相信很多前端小伙伴在工作和学习中,都会或多或少的接触和了解到匿名函数和闭包。也去网上搜索了不少的资料,查到资料和解释都各有说辞,甚至有些解释本身就是不正确的,这更加让人头疼。今天就来聊一聊匿名函数和闭包,浅谈一下他们之间的关系(实际上他们之间并没有什么直接关系!important)。 什么是匿名函数 与匿名函数相对应的是具名函数,具名函数非常简单:function myFn(){},这...

友人C君的博客 1282

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

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

锦瑟年华,逐梦之人 880

js中的匿名函数和闭包总结篇

匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数。一.匿名函数//普通函数 function box() { //函数名是box return 'Lee'; }//匿名函数 function () { //匿名函数,会报错 return 'Lee'; }//通过表达式自我

爱生活,爱学习 3538

JavaScript 匿名函数和闭包

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

莫负时光 603

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

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

吴声子夜歌的博客 2373

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

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

Schaffer的博客 381

js 匿名函数和闭包

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

bjgfs的专栏 439

js匿名函数和闭包总结

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

weixin_34054931的博客 258
上一篇: javascript深入理解js闭包
下一篇: 兼容绑定事件的3种方法
Hobootu
博客等级 码龄15年 41粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值