JavaScript中匿名函数循环传参数(不触发函数的执行)
- 我们都知道定义函数的方式有两种,一种是函数声明,另一种是函数表达式,函数声明的语法是这样的:
function functionName(arg0, arg1, arg2) {
// 函数体
}
- 函数表达式有几种不同的表达方式,下面是最常见的一种形式:
var functionName = function(arg0, arg1, arg2) {
// 函数体
}
- 我们也有见到这样的写法
(functioin(arg0, arg1){})(arg0, arg1)
- 对于上面的写法,我们可以这样理解,第一个括号的内容,我们可以认为是匿名函数的函数名,第二个括号用来传参数,这样一看,是不是很像函数的调用呀,事实上,也就是这样
回归正题,如何在循环中给匿名函数传参,并且是在不触发执行的情况下
- 假定有一个for循环,你需要根据索引给数组中的某个元素绑定click事件,并且需要把索引也传到绑定的事件中,我们该怎么做呢?
for (var i = 0; i <= 10; i++) {
var item = arr[i] // arr是预先定义好的一个数组
item.onclick = function () {
console.log(i)
}
}
- 这样子的预期输出应该都是10,于是我们换用下面这种写法
for (var i = 0; i <= 10; i++) {
var item = arr[i]
item.onclick = (function (index) {
console.log(index)
})(i)
}
- 这样子使用函数表达式的写法,虽然能够输出1,2,3,...,但是却是,代码一执行,就输出了,这并不是我们想要的结果,我们的预期是,只有当点击的时候,才输出,于是乎,我们来看看到底应该怎么写
for (var i = 0; i <= 10; i++) {
var item = arr[i]
item.onclick = (function (index) {
return function () {
console.log(index)
}
})(i)
}
- 这样子就可以完美符合我们的预期了,为什么闭包里要再返回一个匿名函数呢,我自己是这样理解的,返回了一个函数声明,所以代码执行到这个地方时,并不会执行函数内部的代码,只有当点击的时候,才会进行对这个函数的调用,有兴趣的可以自己测试下
JavaScript中匿名函数循环传参数(不触发函数的执行)的更多相关文章
- JavaScript中的事件循环机制跟函数柯里化
一.事件循环机制的理解 test();//按秒输出5个5 function test() { for (var i = 0; i < 5; i++) { setTimeout(() => ...
- 深入理解javascript中的事件循环event-loop
前面的话 本文将详细介绍javascript中的事件循环event-loop 线程 javascript是单线程的语言,也就是说,同一个时间只能做一件事.而这个单线程的特性,与它的用途有关,作为浏览器 ...
- ios开发@selector的函数如何传参数/如何传递多个参数
不同的类会有不同的传递方式,参数名也不尽相同.如果是传单个参数的就不用集合,如果是传多个参数可以用类似nsarray,nsdictionary之类的集合传递.看下面例子: 例子1: 通过NSTimer ...
- C#多线程函数如何传参数和返回值
详见网站:http://WWW.MOVIH.COM就是一个多线程爬虫系统. C#多线程函数如何传参数和返回值 提起多线程,不得不提起 委托(delegates)这个概念. 我理解的委托 ...
- [译]Javascript中的for循环
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- [译]Javascript中的do-while循环
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- jquery绑定事件时如何向事件函数里传参数
jquery绑定事件时如何向事件函数里传参数 jquery绑定事件时如何向事件函数里传参数 举例子说明: 步骤1: var button=$('<button type="button ...
- 深入了解 JavaScript 中的 for 循环
在ECMAScript5(简称 ES5)中,有三种 for 循环,分别是: 简单for循环 for-in forEach 在2015年6月份发布的ECMAScript6(简称 ES6)中,新增了一种循 ...
- 深入了解JavaScript中的for循环
在ECMAScript5中,有三种for循环,分别是: 简单for循环 for-in forEach 在ES6中,新增了一种循环 for-of 简单for循环 const arr = [1, 2, 3 ...
随机推荐
- BZOJ 3943 [Usaco2015 Feb]SuperBull:最大生成树
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3943 题意: 有n只队伍,每个队伍有一个编号a[i]. 每场比赛有两支队伍参加,然后选一支 ...
- Vue2.0项目
什么是 Vue Vue 是一个前端框架,特点是 数据绑定 比如你改变一个输入框 Input 标签的值,会 自动同步 更新到页面上其他绑定该输入框的组件的值  组件化 页面上小到一个按钮都可以是一个单 ...
- 分享知识-快乐自己:关于 String 小案例
单个字符出现的次数: /*** * 验证是否符合拆分条件 * * @param text * 原字符串 * @param sub * 判断条件 * @return */ public static i ...
- Linux下重命名文件或文件夹(mv命令与rename命令)
在Linux下重命名文件或目录,可以使用mv命令或rename命令 mv ———————————— mv命令既可以重命名,又可以移动文件或文件夹. 例子:将目录A重命名为B mv A B 例子:将/a ...
- 【Educational Codeforces Round 38】D. Buy a Ticket 堆优化Dijkstra
题意 给定一张无向图,对每个点$i\in S$求$\min_{j\in S} {2\times d(i,j)+a_j}$ 考虑多源多汇最短路会超时,换个角度考虑每个$j$,如果$j=i$,那么答案为$ ...
- 关于MFC中重载函数是否调用基类相对应函数的问题
在重载CDialog的OnInitDialog()函数的时候,在首行会添加一句:CDialongEx::OnInitDialog();语句,这是为什么呢?什么时候添加,什么时候不添加? 实际上,我们在 ...
- freeMarker(三)——模板开发指南之数值、类型
学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 模板开发指南——数值.类型 1.基本内容 1.1 什么是数值? 正如你 ...
- HihoCoder1338 A Game(记忆化搜索)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Little Hi and Little Ho are playing a game. There is an integ ...
- 1022 Digital Library (30)(30 分)
A Digital Library contains millions of books, stored according to their titles, authors, key words o ...
- BZOJ2563阿狸和桃子的游戏
2563: 阿狸和桃子的游戏 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 952 Solved: 682[Submit][Status][Discu ...