目标:点击任何一个li,提示当前点击位置

  <ul>
<li>第1个</li>
<li>第2个</li>
<li>第3个</li>
<li>第4个</li>
<li>第5个</li>
</ul>
<script>
var li = document.getElementsByTagName('li');
for (var i = 0; i< li.length; i++){
li[i].onclick = function(){
alert("[2]:"+i); // [2]
}
alert("[1]:"+i) // [1]
}
</script>

1、先执行[1]位置,弹出5次警示框从0到4,执行的是for语句,i 在for内部已经变为5

2、li[i],是获取的li的HTMLCollection对象,i[i]相当于li.item(i)

3、为li[i]绑定事件,li[i].onclick 。实际上此时执行的匿名函数动态绑定的li[i],但是匿名函数是在全局中挂起(我将它理解为调用另一个函数),点击任何li弹出框都报出数字5。

修改成闭包:

    <script>
var li = document.getElementsByTagName('li');
for (var i = 0; i< li.length; i++){ li[i].onclick = (function(num){
return function(){alert(num);}
})(i); }
</script>

每一个li[i],单独调用闭包后的函数,可以理解为每个li[i]单独传值制造函数。

理解闭包:

1. 视为正在执行新函数,且绑定在数据链上的函数,因此如果直接调用内部函数则会报错。(从新生成占用内存,因此谨慎使用)

var foo = {
baz: ,
bar: function() {
return (function(that){
return that.baz;
})(this)
}
};
console.log( foo.bar() ) // 1

2.闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便。

3.闭包的执行。

var f = (
function f(){ return ""; },
function g(){ return ; }
)();
typeof f; // "number"

类似于

function f(){
function f(){
var a = ;
return a;
};
function g(){
var b =;
return b;
}
return LastOne() // lastone 代表最后执行的函数
};
console.log(f());

相关知识点:

1.作用域:

外部不能调用局部变量。但是可以通过返回函数这种变通的方法调用到局部变量

function f1(){
    n=;
    function f2(){
      alert(n);
    }
    return f2;
  }
  var result=f1();
  result(); // 999 ,如果调用result会返回function f2()这个函数,加()代表执行

最新文章

  1. 【WP开发】记录屏幕操作
  2. C#面向对象概念之继承
  3. Android 学习第14课,Android 布局
  4. TreeMap按照value进行排序
  5. ASP.NET Web Api 服务器端变了,客户端该如何修改请求(转载)
  6. Ubuntu安装steam游戏平台的解决方案
  7. curl get post 数据
  8. MyBatis学习总结3-优化MyBatis配置文件
  9. Super Hide IP 3.4.7.8允许您以匿名方式进行网上冲浪、 保持隐藏您的 IP 地址
  10. hihocoder第42周 k*N骨牌覆盖(状态dp+矩阵快速幂)
  11. node基础篇二:模块、路由、全局变量课堂(持续)
  12. 在浏览器地址栏输入URL,按下回车后究竟发生了什么?
  13. spring 依赖注入时,什么时候会创建代理类
  14. sql 复习练习
  15. ACM Adding Reversed Numbers(summer2017)
  16. windows下搭建vue开发环境+IIS部署
  17. Log4j配置发邮件功能
  18. Redis都有哪些数据类型
  19. 算法基础_递归_给定一个数字n,打印出所有的划分等式
  20. Sudoku(第二次作业)

热门文章

  1. oracle定时执行计划任务
  2. JAVA Layout
  3. python 【第四篇】:面向对象(一)
  4. New Relic——手机应用app开发达人的福利立即就到啦!
  5. adb server is out of date.
  6. Javascript基础篇小结
  7. 使用MyBatis搭建一个访问mysql数据库的简单示例
  8. Git--廖雪峰的博客的学习笔记
  9. IE 对象不支持“attachEvent”属性或方法
  10. 创建一个支持异步操作的operation