以下内容纯属个人理解,不正确的地方还请大神留言,不胜感激!

源代码:(按个人方式选用一种即可)

 <ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<script type="text/javascript">
            var aLi = document.getElementsByTagName("li");

            for(var i=0; i<aLi.length; i++){

                /* 方式一(通过调用一个闭包函数,来保存当前变量i) */
show(i);
function show(i){
aLi[i].onclick = function(){console.log(i);}
} /* 方式二(方法一的即时调用写法,原理不变)*/
(function(x){
aLi[x].onclick = function(){console.log(x);}
})(i); /* 方式三 (通过给当前节点自定义一个属性值,来保存变量i) */
aLi[i].index=i;
aLi[i].onclick = function(){
console.log(this.index);
}; } /* end for*/
</script>

刚开始的时候不是很理解方法二,经过一番折腾,才弄明白。

此处对变量i的存储用了"JS闭包"相关的知识,并通过一个“即时函数”来简洁代码

 先看下下面的这个:

    <script type="text/javascript">
function fun(){
return 5
}
var a=fun;
var b=fun();
</script>

函数:JS函数是一种叫做function引用类型的实例,因此函数是一个对象,它保存在内存中,函数名则是指向这个对象的指针。例如以上的 "fun"

var a = fun 意思是把函数名的指针拷贝一份给a,并不是函数的本身,也不是函数执行后的返回值

如果函数名后面加上圆括号,就表示立即调用(执行)这个函数里面的代码(花括号里的代码)。

同理:函数声明和函数表达式在私有作用域写法方面也会在函数体后面加圆括号表示立即调用

同理,我们可以想到像下面这样调用函数

function fun(){
return 5
}();

然而这样是错误的,因为JavaScript 将function 关键字当作一个函数声明的开始,而函数声明后面不能跟圆括号。然而,函数表达式的后面可以跟圆括号。要将函数声明转换成函数表达式,只要像下面这样给它加上一对圆括号即可。

(function fun(){
return 5
})();

到这,应该就理解了刚开始的函数执行方式了,只是在括号里加了一个参数i,然后每次弹出i,也就是当前li标签在数组中的下标。

扩展:如果想进一步了解,可以看下 javaScript中如何应用 '即时函数 '模仿块级作用域 ".

JS 循环给li绑定参数不同的点击事的更多相关文章

  1. js循环给li绑定事件实现 点击li弹出其索引值 和内容

    代码如下: html代码 <ul> <li>房产</li> <li>家居</li> <li>二手房</li> < ...

  2. js循环给li绑定事件实现和弹出对应的索引

    原文:http://www.cnblogs.com/wuchuanlong/p/5945286.html 方法一,动态添加click事件,并添加属性 var itemli = document.get ...

  3. js:for循环ul/li,获取当前被点击元素的id,以及给其他li设置属性

    js:for循环ul/li,获取当前被点击元素的id,以及给其他li设置属性 <!doctype html> <html> <head> <meta char ...

  4. JS: javascript 点击事件执行两次js问题 ,解决jquery绑定click事件出现点击一次执行两次问题

    javascript 点击事件执行两次js问题 在JQuery中存在unbind()方法,先解绑再添加点击事件,解决方案为: $(".m-layout-setting").unbi ...

  5. vue.js循环语句

    vue.js循环语句 循环使用 v-for 指令. v-for 指令需要以 site in sites 形式的特殊语法, sites 是源数据数组, site 是数组元素迭代的别名. v-for 可以 ...

  6. js循环添加事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. jQuery图片无缝滚动JS代码ul/li结构

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 原生js实现数据双向绑定

    最近接触了vue,在谈到vue等等的mvvm框架之前,先了解什么是数据双向绑定以及如何利用原生JS实现数据双向绑定 单向数据绑定 指先把模板写好,然后把模板和数据(数据可能来自后台)整合到一起形成HT ...

  9. JS循环中使用bind函数的参数传递问题

    JS循环中使用bind函数的参数传递问题,问题代码如下: for (var sc in result) { var tempp = '<div class="sidebar_todo_ ...

随机推荐

  1. Ubuntu 14 Trusty安装hue

    想开始学习一下hive,需要一个使用起来方便的客户端,网上搜了一下发现hue是个很常用的工具.于是,就在自己的ubuntu14系统里,尝试安装hue.下面就是自己的安装步骤,记录如下: 1.先查看自己 ...

  2. redis 缓存技术与memcache的区别

    1 什么是redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset( ...

  3. Shell命令和流程控制

    Shell命令和流程控制 在shell脚本中可以使用三类命令: 1)Unix 命令: 虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令.这些命令通常是用来进行文件和文字 ...

  4. webapi frombody fromuri的参数绑定规则

    在WebAPI中,请求主体(HttpContent)只能被读取一次,不被缓存,只能向前读取的流. 举例子说明: 1. 请求地址:/?id=123&name=bob 服务端方法: void Ac ...

  5. JSON字符串和JS对象之间的转换

    JSON字符串和JS对象之间的转换 1 json字符串转换为js对象 1.1 标准json格式字符串转换为Js对象  JSON字符串 str JSON.parse(str) eval(str) eva ...

  6. POJ 2391 Ombrophobic Bovines

    Ombrophobic Bovines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18623   Accepted: 4 ...

  7. [LeetCode] Add Strings 字符串相加

    Given two non-negative numbers num1 and num2 represented as string, return the sum of num1 and num2. ...

  8. VS调试经常打断点打上之后没反应的问题

    在调试的时候经常会发现打了断点但是始终不进到程序中来,这是因为访问的这个页面在服务器中有缓存,也就是在iis中产生了缓存.访问的时候直接进到读取的缓存文件, 根本没有读取项目文件,所以打了断点肯定进不 ...

  9. canvas

    1. 画布可以通过两只手指上下移动,画布大小默认为屏幕大小的2倍,通过自定义View,嵌套scollview实现. Y 2. 通过处理手指触摸事件,一根手指时,使用Canvas绘制移动路径,产生直线: ...

  10. oracle的round函数和trunc函数

    --Oracle trunc()函数的用法/**************日期********************/1.select trunc(sysdate) from dual --2013- ...