还是昨天的那个简单的小项目,已经花了一天的时间了 - - 。从&&的用法,到CSStext,到今天马上要谈的闭包(closure),通过一个小东西,真真发现了自己的各方面不足。昨天发完源码之后,自己手写一遍,还是碰到了一些问题,最主要的就是for循环中的闭包问题。

这是我之前的代码,大致就是这样:

for(var i = 0;i<=oBtn.length;i++){
oBtn[i].onclick=function(){
change_style(oDiv,oAttr[i],oVal[i]);
}
}

当时理所应当会以为出来结果,才发现虽然没有报错,但是也没有反应。console了一下发现oAttr[i],oVal[i],都是undefined,这就让我纳闷了,然后测试了一个例子:

for(var i = 0;i<=5;i++){
input.onclick=function(){
console.log(i);
}
}

测试结果为一个6让我蛋疼了好一会 -  -,然后在网上google了之后发现,问题的原因大致是当for循环执行完毕后,i变量被垃圾回收,接着执行click函数的时候,因为内部没有i变量所以会去父级作用域去找,那时for循环已经执行完成,所以只会输出6.我自己的理解的话,解决方法总结起来应该是两种类型,一种就是增加若干个对应的闭包域空间(这里采用的是匿名函数),专门用来存储原先需要引用的内容(下标),不过只限于基本类型(基本类型值传递,对象类型引用传递),另一种就是用一个变量索引,保存一直i的值。

还是拿上一篇的例子,实现简单的DIV属性切换,如果用闭包实现的话可以这样:

for(var i=0;i<=oBtn.length-1;i++){
(function(i){
oBtn[i].onclick=function(){
if (i == 4) {
oDiv.style.cssText = '';
}else{
change_style(oDiv,oAttr[i],oVal[i]);
}
}
})(i)
}

如果不用闭包的话用索引缓存就可以参考上一篇文章的写法。

感谢阅读!

关于for循环中的闭包问题的更多相关文章

  1. 彻底弄懂js循环中的闭包问题

    来源:http://www.108js.com/article/article1/10177.html?id=899 第一次接触这个问题还是在我刚开始学js的时候,当时就是一头雾水,时隔一年多了,突然 ...

  2. for循环中的闭包

    // 问题1:判断下面一段代码运行的结果是什么? var data = [] for (var i = 0; i < 3; i++) { data[i] = function() { conso ...

  3. 让你分分钟学会Javascript中的闭包

    Javascript中的闭包 前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它 ...

  4. 【原】理解javascript中的闭包

    闭包在javascript来说是比较重要的概念,平时工作中也是用的比较多的一项技术.下来对其进行一个小小的总结 什么是闭包? 官方说法: 闭包是指有权访问另一个函数作用域中的变量的函数.创建闭包的常见 ...

  5. [译] Closures in Lua - Lua中的闭包

    原文:(PDF) . 摘要 一等(first-class)函数是一种非常强大的语言结构,并且是函数式语言的基础特性.少数过程式语言由于其基于栈的实现,也支持一等函数.本文讨论了Lua 5.x用于实现一 ...

  6. 前端随笔 - JavaScript中的闭包

    前阵子重新复习了一下js基础知识,第一篇博客就以分享闭包心得为开始吧. 首先,要理解闭包,就必须要了解一个概念:作用域链. 作用域链 作用域代表着可访问变量的集合,变量分为全局变量和局部变量两种,在函 ...

  7. [转][译] Closures in Lua - Lua中的闭包

    http://www.cnblogs.com/plodsoft/p/5900270.html?utm_source=tuicool&utm_medium=referral 原文:(PDF) . ...

  8. Javascript中的闭包(转载)

    前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.下面是作者从作用域链慢慢讲到 ...

  9. 狗日的Javascript中的闭包

    前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.下面是作者从作用域链慢慢讲到 ...

随机推荐

  1. Cocos2d-x java 通过jni调用c++的方法

    前面博客说到,cocos2d-x c++界面层运行在一个GLThread线程里面,严格的说是运行在Cocos2dxGLSurfaceView(继承自GLSurfaceView) 里面.opengl的渲 ...

  2. 28个Unix/Linux的命令行神器

    下面是Kristóf Kovács收集的28个Unix/Linux下的28个命令行下的工具(原文链接),有一些是大家熟悉的,有一些是非常有用的,有一些是不为人知的.这些工具都非常不错,希望每个人都知道 ...

  3. 【解决】U盘装系统(Win7/Win8)& 装双系统

    作为一名计算机的学生,不会装系统是不是会被笑掉大牙?!! .. 我一直就不太会(不是不会,是不熟练) .. 所以今天闲着没事,把旧电脑捣鼓起来 .. 主要是为了熟悉U盘装系统和装双系统的步骤 .. 基 ...

  4. 《Linear Algebra and Its Applications》-chaper1-线性方程组- 线性变换

    两个定理非常的简单显然,似乎是在证明矩阵代数中的基本运算律.但是它为后面用“线性变换”理解矩阵-向量积Ax奠定了理论基础. 结合之前我们讨论过的矩阵和向量的积Ax的性质,下面我们就可以引入线性变换了. ...

  5. Android NDK开发Crash错误定位[转]

    使用 ndk-stack 的时候需要你的 lib 编译为 debug版的,通常需要下面的修改: 1. 修改 android.mk,增加,为 LOCAL_CFLAGS 增加 -g 选项 2. 修改 ap ...

  6. POJ 3125 Printer Queue

    题目: Description The only printer in the computer science students' union is experiencing an extremel ...

  7. JSP实现数据库(MySQL)查询——Java Web练习(二)

    1.创建数据库表student(数据库test01) 2.修改success.jsp页面,修改后的页面整体代码如下: <%@ page language="java" imp ...

  8. 线程同步 synchronized 同步代码块 同步方法 同步锁

    一 同步代码块 1.为了解决并发操作可能造成的异常,java的多线程支持引入了同步监视器来解决这个问题,使用同步监视器的通用方法就是同步代码块.其语法如下: synchronized(obj){ // ...

  9. PTA 07-图4 哈利·波特的考试 (25分)

    哈利·波特要考试了,他需要你的帮助.这门课学的是用魔咒将一种动物变成另一种动物的本事.例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等.反方向变化的魔咒就是简单地将原来的魔咒倒过来念 ...

  10. mysql引擎互转问题

    // InnoDB转MyISAM ALTER TABLE `tablename` ENGINE = MYISAM // MyISAM转InnoDB alter table tablename type ...