目标:点击任何一个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()这个函数,加()代表执行

Js闭包与循环的更多相关文章

  1. JS闭包导致循环给按钮添加事件时总是执行最后一个

    加入如下脚本代码: <script> var list_obj = document.getElementsByTagName('li'); for (var i = 0; i <= ...

  2. js闭包for循环总是只执行最后一个值得解决方法

    <style> li{ list-style: none;width:40px;height: 40px;text-align:center;line-height: 40px;curso ...

  3. js闭包的作用域以及闭包案列的介绍:

    转载▼ 标签: it   js闭包的作用域以及闭包案列的介绍:   首先我们根据前面的介绍来分析js闭包有什么作用,他会给我们编程带来什么好处? 闭包是为了更方便我们在处理js函数的时候会遇到以下的几 ...

  4. js闭包理解实例小结

    Js闭包 闭包前要了解的知识  1. 函数作用域 (1).Js语言特殊之处在于函数内部可以直接读取全局变量 <script type="text/javascript"> ...

  5. js闭包和ie内存泄露原理

    也议 js闭包和ie内存泄露原理 可以, 但小心使用. 闭包也许是 JS 中最有用的特性了. 有一份比较好的介绍闭包原理的文档. 有一点需要牢记, 闭包保留了一个指向它封闭作用域的指针, 所以, 在给 ...

  6. js闭包实例汇总

    本文是通过实例来帮助大家深刻理解js闭包,是篇非常不错的文章,这里推荐给大家,有需要的小伙伴可以参考下 Js闭包 闭包前要了解的知识 1. 函数作用域 (1).Js语言特殊之处在于函数内部可以直接读取 ...

  7. 关于js闭包之小问题大错误

    闭包是 JavaScript 开发的一个关键方面:匿名函数可以访问父级作用域的变量. 如果闭包的作用域中保存着一个 HTML 元素,则该元素无法被销毁.(下面代码来自高程) 刚看到一个关于闭包自己没注 ...

  8. js闭包之我见

    很久前的一个问题终于得以解决,内心是无比喜悦的,不多说,先上代码: function test(){ for(var i=0;i<5;i++){ window.onclick=function( ...

  9. js闭包引起的事件注册问题

    背景:闲暇时间看了几篇关于js作用域链与闭包的文章,偶然又看到了之前遇到的一个问题,就是在for循环中为dom节点注册事件驱动,具体见下面代码: <!DOCTYPE html> <h ...

随机推荐

  1. N沟道增强型MOS管双向低频开关电路

    MOS-N 场效应管 双向电平转换电路 -- 适用于低频信号电平转换的简单应用 如上图所示,是 MOS-N 场效应管 双向电平转换电路.双向传输原理: 为了方便讲述,定义 3.3V 为 A 端,5.0 ...

  2. 与ARM7相比Cortex-M3优势明显

  3. C++默认参数与函数重载 注意事项

    一.默认参数在C++中,可以为参数指定默认值.在函数调用时没有指定与形参相对应的实参时, 就自动使用默认参数. 默认参数的语法与使用:(1)在函数声明或定义时,直接对参数赋值.这就是默认参数:(2)在 ...

  4. iOS中Blocks的介绍

    1. 什么是Blocks Blocks是C语言的扩充功能.如果用一句话来概括就是:带有自动变量的匿名函数. 第一次看见Blocks的时候,感觉很类似C语言的函数指针,尤其是Block类型变量,更是有极 ...

  5. PHPExcel 多工作表 导入

    //参数初始化 $filePath = ''; if ($_FILES["file"]["error"] > 0) { returnJSON(ERROR_ ...

  6. android可拖动排序GridView实现

    经常使用今日头条.网易新闻的同学们应该都会注意到用于管理多个频道的可拖动排序GridView,下面介绍一下可拖动的DragGridView的实现方法.代码放在GitHub上https://github ...

  7. curl返回值写入内存的场景

    直接上代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <cur ...

  8. English - even though和even if用法解析

    even though和even if的用法区别两者均可用于引导让步状语从句,其细微区别是: 1. even if 引导的从句是往往是假设性的,相当于汉语的“即使”“纵然”“就算”“哪怕”. 如:Th ...

  9. 红豆带你从零学C#系列之:开始C#编程(二)

    控制台程序开发之补充说明 你已经动手操作过我们上一篇文章中的控制台程序输入输出了吗朋友? 如果没有的话,强烈建议你先回去做一遍再来继续学习噢!上一篇文章地址:点击这里 一.    你问我答 问:代码是 ...

  10. spring mvc 非注解形式

    目录(?)[+] webxml配置文件 注如果使用注解可以加上-- servlet上下文配置文件 test-servletxml 实体类Empjava StartController控制器 控制器Em ...