• 我们都知道定义函数的方式有两种,一种是函数声明,另一种是函数表达式,函数声明的语法是这样的:
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中匿名函数循环传参数(不触发函数的执行)的更多相关文章

  1. JavaScript中的事件循环机制跟函数柯里化

    一.事件循环机制的理解 test();//按秒输出5个5 function test() { for (var i = 0; i < 5; i++) { setTimeout(() => ...

  2. 深入理解javascript中的事件循环event-loop

    前面的话 本文将详细介绍javascript中的事件循环event-loop 线程 javascript是单线程的语言,也就是说,同一个时间只能做一件事.而这个单线程的特性,与它的用途有关,作为浏览器 ...

  3. ios开发@selector的函数如何传参数/如何传递多个参数

    不同的类会有不同的传递方式,参数名也不尽相同.如果是传单个参数的就不用集合,如果是传多个参数可以用类似nsarray,nsdictionary之类的集合传递.看下面例子: 例子1: 通过NSTimer ...

  4. C#多线程函数如何传参数和返回值

          详见网站:http://WWW.MOVIH.COM就是一个多线程爬虫系统.   C#多线程函数如何传参数和返回值 提起多线程,不得不提起 委托(delegates)这个概念. 我理解的委托 ...

  5. [译]Javascript中的for循环

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  6. [译]Javascript中的do-while循环

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  7. jquery绑定事件时如何向事件函数里传参数

    jquery绑定事件时如何向事件函数里传参数 jquery绑定事件时如何向事件函数里传参数 举例子说明: 步骤1: var button=$('<button type="button ...

  8. 深入了解 JavaScript 中的 for 循环

    在ECMAScript5(简称 ES5)中,有三种 for 循环,分别是: 简单for循环 for-in forEach 在2015年6月份发布的ECMAScript6(简称 ES6)中,新增了一种循 ...

  9. 深入了解JavaScript中的for循环

    在ECMAScript5中,有三种for循环,分别是: 简单for循环 for-in forEach 在ES6中,新增了一种循环 for-of 简单for循环 const arr = [1, 2, 3 ...

随机推荐

  1. Nexus4_识别电池真假

    1.参考网址:http://bbs.gfan.com/android-7509786-1-1.html ([6_25更新]给N4换一个“原装的芯”&[免拆]识别真假电池 - LG Nexus ...

  2. MySQL- 用Navicat通过隧道连接到远程数据库

    在企业中,为了安全地使用服务器,常常是用通过堡垒机才能连接到企业内部的服务器,当然也包括数据库. 于是我们时时需要通过堡垒机打隧道连到数据库,下面展示如何使用xshell用Navicat通过隧道连接到 ...

  3. Linux课程---10、权限管理(权限有哪几种)

    Linux课程---10.权限管理(权限有哪几种) 一.总结 一句话总结: r 读 w 写 x 执行 1.drwxr-x---  2 root root  4096 Jan 20 19:39 mnt ...

  4. python3 字符串属性(四)

    1. S.partition(sep) -> (head, sep, tail) Search for the separator sep in S, and return the part b ...

  5. 【二叉树的递归】02二叉树的最大深度【Maximum Depth of Binary Tree】

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给定一个二叉树,找出他的最小的深度 ...

  6. NYOJ-小猴子下落

    描述 有一颗二叉树,最大深度为D,且所有叶子的深度都相同.所有结点从左到右从上到下的编号为1,2,3,·····,2的D次方减1.在结点1处放一个小猴子,它会往下跑.每个内结点上都有一个开关,初始全部 ...

  7. Java中CountDownLatch类的使用

    0.CountDownLatch作用 1) Java api中的解释:一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 2) CountDownLatch可以使J ...

  8. Maven运行JUnit测试(http://www.360doc.com/content/13/0927/15/7304817_317455642.shtml)

    Maven单元测试 分类: maven 2012-05-09 15:17 1986人阅读 评论(1) 收藏 举报 maven测试junit单元测试javarandom   目录(?)[-] maven ...

  9. mac下无法远程桌面连接win10的解决办法

    原文链接:http://www.hangge.com/blog/cache/detail_899.html 原来在Mac OSX下远程win7系统很正常,后来把windows系统升级成了win10,再 ...

  10. Azure 用户自定义路由 (User Defined Route)

    在公有云环境中,用户创建了一个Vnet,添加了若干个网段后,这几个网段是全联通的状态. 如果希望在Vnet中添加一些功能性的设备,比如防火墙.IPS.负载均衡设备等,就需要进行用户自定义路由的配置. ...