JavaScript匿名函数以及在循环中的匿名函数

一 历史

JavaScript其实是一门奇异的语言,TA的一大特性是没有块级作用域

for(var i=0;i<10;i++){}
console.log(i)

大家猜测下值是多少?
答案是 10, 虽然我们在一个块内申明了变量,但i却是在全范围内起作用的,所以就引入了匿名函数

function(){var i=0;...
}

以函数的作用域来限定变量作用域

二 立即执行匿名函数

当然,还立即执行的匿名函数

(function(){do sth.....
})()

第一次看到感觉真tm古怪,还tm要这样写,太tm古怪了,我们可以这样看:
定义一个虚拟变量 var foo = function(){...}
然后foo要执行,所以就

foo() = (function(){do sth.....})()

好了,匿名函数就立即执行了

三 循环中的匿名函数

大家看下面一段代码

function foo(){var arr = [];for(var i =0;i<5;i++){arr[i] = function(){//console.log(i) 来看看什么时候运行return i;   //定义函数时i的值并没有初始化,指向函数外的i,因此,当匿名函数运行时,这个值就指向最大的i了}}return arr;
}var a = foo();   //arr的赋值没有被执行
for (var i = 0; i< 5 ;i++){alert(a[i]());
}

有兴趣的不妨运行一下,答案是5个5,发生什么事了呢?
我们在对arr赋值的时候:

 arr[i] = function(){return i;  }

函数里面的i是没有分配具体的值的,它指向了最外层的i,而运行时才会赋值,所以,它就是最大的5了,再看一个例子

var arr = document.getElementsByTagName("p");for(var i = 0; i < arr.length;i++){arr[i].onclick = function(){alert(i);}}

这是一个DOM的onclick事件,当点击的时想能够弹出不同的i值,实际上是无法实现的,所以,必须使用匿名函数的立即执行来限定作用域

var arr = document.getElementsByTagName("p");for(var i = 0; i < arr.length;i++){(function(j){arr[j].onclick = function(){alert(j);}})(i)}

四 循环中的异步函数

这样一段代码

for(var i=0;i<n;i++){ajax(i,function(....)) //这里是一个异步调用,还有request,http等
}

这里i会是最大值,为何呢?因为这是一个异步函数,而非同步立即返回的函数,此时由于js奇怪的单线程机制,会待同步全部结束后再运行异步的代码,所以i始终是最大值,那么要用什么方法解决呢?是的,加一个闭包。

这里留下一个问题,如果写成这样,你觉得可以么

for(var i=0;i<n;i++){var j={a:i}ajax(j.a,function(....))
}

总之,js真是一门奇异的语言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289786.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux内核笔记--内存管理之用户态进程内存分配

内核版本&#xff1a;linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作&#xff0c;内存分配是其中非常重要的一环&#xff0c;作为一个linux程序员必然会想要知道这个过程到底是怎么样的&#xff0c;内核源码会告诉你这一切。 线性区 一个可执行程序&#xff…

Android之javax.net.ssl.SSLPeerUnverifiedException: Hostname ip not verified:解决办法

1、问题 用HttpURLConnection去请求的时候抛了下面的异常 HttpRequest$HttpRequestException: javax.net.ssl.SSLPeerUnverifiedException: Hostname ip not verified: 2、分析和解决 从异常来看是因为SSL协议握手的过程中,这个服务度地址的证书没有被证实,被信任。 clien…

php 字符串进行计算_怎么在php中利用eval对字符串格式进行计算

怎么在php中利用eval对字符串格式进行计算发布时间&#xff1a;2020-12-16 16:42:57来源&#xff1a;亿速云阅读&#xff1a;101作者&#xff1a;Leah本篇文章给大家分享的是有关怎么在php中利用eval对字符串格式进行计算&#xff0c;小编觉得挺实用的&#xff0c;因此分享给大…

Xamarin效果第十四篇之玩耍GIS

最近再次拾起Xamarin然后也实现了祖传PLC控制和弹窗配置;这不又一次勾起来我想基于他玩玩原来一直玩耍的GIS,毕竟咱前面一直玩耍二维和三维的GIS相关的知识点;有兴趣的小伙伴可以翻翻我的历史文章;趁着激情满满;来看看最终咱实现的加载高德平面地图效果(有水印):再者就是满足群…

Android下载apk异常java.net.SocketTimeoutException: timeout解决办法

1、问题 实现下载apk的时候&#xff0c;抛出下面异常 java.net.SocketTimeoutException: timeout 2、分析 很明显是socket超时了&#xff0c;由于我的wifi网络比较慢&#xff0c;设置的超时时间可能短了。 在写入由 GetRequestStream 方法返回的流时&#xff0c;或在读取由…

SQL SERVER两种分页的存储过程介绍

由于现在很多的企业招聘的笔试都会让来招聘的写一个分页的存储过程,有的企业甚至要求应聘者用两种方式实现分页,如果没有在实际项目中使用过分页,那么很多的应聘者都会出现一定的问题,下面介绍两种分页的方法。 一、 以学生表为例,在数据库中有一个Student表,字段有 …

Java Socke 探究

Java中的Socket可以分为普通Socket和NioSocket两种。 普通Socket的用法 Java中的网络通信是通过Socket实现的&#xff0c;Socket分为ServerSocket和Socket两大类&#xff0c;ServerSocket用于服务端&#xff0c;可以通过accept方法监听请求&#xff0c;监听到请求后返回Socket&…

codeforces 600D Area of Two Circles' Intersection

分相离&#xff0c;内含&#xff0c;想交三种情况讨论一下。 主要是精度和数据范围的问题&#xff0c;首先数据用long double&#xff0c;能用整型判断就不要用浮点型。 题目中所给的坐标&#xff0c;半径是整型的&#xff0c;出现卡浮点判断的情况还是比较少的。 最后算三角型…

PHP进程退出信号_一文吃透 PHP 进程信号处理

背景前两周老大给安排了一个任务&#xff0c;写一个监听信号的包。因为我司的项目是运行在容器里边的&#xff0c;每次上线&#xff0c;需要重新打包镜像&#xff0c;然后启动。在重新打包之前&#xff0c;Dokcer会先给容器发送一个信号&#xff0c;然后等待一段超时时间(默认1…

GitHub Copilot 现已登陆 Visual Studio!

激动人心的好消息来了&#xff0c;GitHub 在3月29日发布博客&#xff0c;宣布 Github Copilot 现在可以在 Visual Studio 中使用。我们知道 Visual Studio 的 IntelliCode 本身已经很智能了, 现在又迎来了 Copilot, 编程体验将进入新的篇章。如何安装? 首先&#xff0c;您…

经典实用SQL语句大全汇总

目 录 1.随机取3条记录 2.随机选记录 3.删除重复记录 4.创建数据库 5.列出表里的所有的列名 6.选择从10到15的记录 7.压缩数据库

java之写接口回调编程经验改进

1、问题 在一个类里面数据的变化需要在另外一个类里面动态得到&#xff0c;比如在我的异步任务里面下载的数据&#xff0c;需要在UI界面的ProgressDialog里面动态显示&#xff0c;我们需要在异步任务里面写个接口&#xff0c;然后接口里面有一些函数&#xff0c;至于在Progres…

Mac Ubuntu ----端口被占用

Mac下使用lsof&#xff08;list open files&#xff09;来查看端口占用情况&#xff0c;lsof 是一个列出当前系统打开文件的工具。 使用 lsof 会列举所有占用的端口列表&#xff1a; 1$ lsof使用less可以用于分页展示&#xff0c;如&#xff1a; 1$ lsof | less也可以使用 -i 查…

iOS 9音频应用播放音频之音量设置与声道设置

iOS 9音频应用播放音频之音量设置与声道设置 iOS 9音频应用音量设置 音量又称响度、音强&#xff0c;是指人耳对所听到的声音大小强弱的主观感受&#xff0c;其客观评价尺度是声音的振幅大小。在iOS 9音频应用的应用中&#xff0c;经常会出现播放的音乐音量过大或者过小。此时i…

nginx配置文件中的location中文详解

location 语法:location [|~|~*|^~] /uri/ { … }默认:否 上下文:server 这个指令随URL不同而接受不同的结构。你可以配置使用常规字符串和正则表达式。如果使用正则表达式&#xff0c;你必须使用 ~* 前缀选择不区分大小写的匹配或者 ~ 选择区分大小写的匹配。 确定 哪个locati…

php fpm工作原理,什么是phpfpm的工作原理?

什么是phpfpm的工作原理&#xff1f;发布时间&#xff1a;2020-07-13 15:12:53来源&#xff1a;亿速云阅读&#xff1a;181作者&#xff1a;Leah什么是phpfpm的工作原理&#xff1f;针对这个问题&#xff0c;这篇文章详细介绍了相对应的分析和解答&#xff0c;希望可以帮助更多…

C#对象映射器之Mapster

简介Mapster是一个快&#xff0c;小巧&#xff0c;功能强大的对象映射.Net框架例子我有两个Model类且他们的属性一致&#xff0c;我们将 SourceObjectTest赋值给DestObjectTest该怎么做&#xff1f;SourceObjectTest sourceObject new SourceObjectTest(); sourceObject.Name …

如何关闭Struts2的webconsole.html

出于安全目的&#xff0c;在禁用了devMode之后&#xff0c;仍然不希望其他人员看到webconsole.html页面&#xff0c;则可以直接删除webconsole.html 的源文件&#xff0c; 它的位置存在于&#xff1a; 我们手工删除 struts2-core-*.jar\org\apache\struts2\interceptor\debuggi…

UIView 的基础

UIView•什么是控件&#xff1f;-屏幕上的所有UI元素都叫做控件&#xff0c;也有人叫做视图、组件-按钮&#xff08;UIButton&#xff09;、文本&#xff08;UILabel&#xff09;都是控件•控件的共同属性有哪些&#xff1f;-尺寸-位置-背景色-......-•苹果将控件的共同属性都…

记录平时编程或者阅读英文文档的时候不认识的英文单词

一、目的 英语虽然过了4级&#xff0c;但是还是很多英文单词不认识&#xff0c;为了以后能更好的阅读英文文档和函数的英文注释&#xff0c;记录自己不认识的英文单词&#xff0c;方便以后复习&#xff0c;这里后面会持续更新&#xff0c;因为放在网上这个平台不会弄丢。 二、…