无意间创建的一个闭包,以及解决办法

闭包的本质是作用域链,我们在工作中经常无意间就会创建一个闭包,比如:

<input type="button" id="id1" value="1"></input>
<input type="button" id="id2" value="2"></input>
<input type="button" id="id3" value="3"></input>
<input type="button" id="id4" value="4"></input>
<input type="button" id="id5" value="5"></input>
<input type="button" id="id6" value="6"></input>
<input type="button" id="id7" value="7"></input>
<input type="button" id="id8" value="8"></input>
<input type="button" id="id9" value="9"></input>
<input type="button" id="id10" value="10"></input>
<script type="text/javascript">
for (var i = 1; i <= 10; i++)
{
   document.getElementById("id"+i).onclick = function ()
    {
        alert(i);
    }
}
</script>

运行之后,会发现每个onclick时间执行时弹出的都是11!

这是因为,onclick 函数是在 全局作用域里面被定义的,被定义的时候,会生成一个对象,这个对象继承了当前执行环境的作用域链。也就是说,这个函数执行体里的 i ,引用的是全局作用域里的i。

因为 for 循环执行完以后,全局作用域下的 i 的值变为了 11,所以才会每个onclick函数都弹出11。

为了解决这个问题,我们需要为每个 onclick 函数的生成建立一个单独的作用域,然后 onclick 函数弹出这个作用域里面的 局部变量:

<input type="button" id="id1" value="1"></input>
<input type="button" id="id2" value="2"></input>
<input type="button" id="id3" value="3"></input>
<input type="button" id="id4" value="4"></input>
<input type="button" id="id5" value="5"></input>
<input type="button" id="id6" value="6"></input>
<input type="button" id="id7" value="7"></input>
<input type="button" id="id8" value="8"></input>
<input type="button" id="id9" value="9"></input>
<input type="button" id="id10" value="10"></input>
<script type="text/javascript">
for (var i = 1; i <= 10; i++)
{
    (function () {
        var m;
        m = i;
        document.getElementById("id"+m).onclick = function ()
        {
            alert(m);
        }
    })();
}
</script>

无意间创建的一个闭包,以及解决办法

时间: 2024-10-12 15:50:04

无意间创建的一个闭包,以及解决办法的相关文章

ViewPage+frament不预加载下一个Frament数据解决办法

在做一个ViewPage+Frament 滑动数效果,当滑动到每一页时加载哪一页的数据,但是ViewPage会预加载下一也数据,这个问题之前做项目是一直未解决,今天找到一个方法一下子就解决的这个问题,Frament里面有一个setUserVisibleHint方法,setUserVisibleHint每次fragment显示与隐藏都会调用,下面说一下这个方法的使用 @Override public void setUserVisibleHint(boolean isVisibleToUser)

异常:未能加载文件或程序集”DAL”或它的某一个依赖项——解决办法

下面是我再使用抽象工厂+反射重构机房时,在Factoy中出现了下面一个问题: 去网上查了一下资料,发现这是一个很普遍的问题,它出现的原因主要有两种: 第一种: 加载DLL路径错误.解决办法是调整D层生成DLL的路径到UI的bin文件夹中.如下图: 反射的一个原则是:一切皆以UI层的bin文件夹中的dll名称为中心,说白一点,dll就是一个类库.我理解的反射,就是一串拼接的字符串,组成要实例化的类的名字.使用反射加载类时,默认是从UI层中的bin中找的,所以要在UI的bin文件夹下生成D层类的dl

Excel在任务栏中只显示一个窗口的解决办法

Excel在任务栏中只显示一个窗口的解决办法 以前朋友遇到过这个问题,这次自己又遇到了,习惯了以前的那种在任务栏中显示全部窗口,方便用Alt+Tab键进行切换. 如果同时打开许多Excel工作簿,在桌面任务栏中通常会显示多个工作簿窗口按钮.如果任务栏只中显示了一个Excel窗口按钮,所有的工作簿窗口只出现在Excel程序窗口内部,可能是相关的设置被改动了,可以通过下面方法改回设置: 在Excel 2003中单击菜单“工具→选项”,选择“视图”选项卡,选择“任务栏中的窗口”. 在Excel 200

SQLSERVER 创建ODBC 报错的解决办法 SQLState:&#39;01000&#39;的解决方案

错误详情如下: SQLState:'01000' SQL Server 错误:14 [Microsoft][ODBC SQL Server Driver][DBNETLIB] ConnectionOpen (Invalid Instance()). 连接失败: SQLState:'08001' SQL Server 错误:14 [Microsoft][ODBC SQL Server Driver][DBNETLIB] 无效的连接. 解决办法: 在创建ODBC数据源的步骤中,点击“客户端配置”,勾

百度编辑器ueditor每次编辑后多一个空行的解决办法

用ueditor进行编辑文章时,每次编辑后文章前面都会多出一个空行. <script id="editor" type="text/plain" style="width:100%;height:315px"> ${store.summary} </script> 解决办法,将变量和scrpit标签写在同一行. <script id="editor" type="text/plain&q

python3 写CSV文件多一个空行的解决办法

Python文档中有提到: open('eggs.csv', newline='') 也就是说,打开文件的时候多指定一个参数.Python文档中也有这样的示例: import csvwith open('eggs.csv', 'w', newline='') as csvfile: spamwriter = csv.writer(csvfile, delimiter=' ', quotechar='|', quoting=csv.QUOTE_MINIMAL) spamwriter.writero

ant jsch.jar - 一个错误及解决办法

ant jsch.jar -- 一个异常及解决方法 运行build.xml出现异常: Cause: Could not load a dependent class com/jcraft/jsch/Logger It is not enough to have Ant's optional JARs you need the JAR files that the optional tasks depend upon. Ant's optional task dependencies are li

Redis一个异常的解决办法,异常描述:Could not get a resource from the pool

异常描述: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool at redis.clients.util.Pool.getResource(Pool.java:22) at com.derbysoft.jredis.longkeytest.BorrowObject.run(BorrowObject.java:22) at java.lang.Thread.

无法找到运行搜索助理需要的一个文件 的解决办法

在执行"搜索"功能时,系统弹出错误对话框,提示"无法找到运行搜索助理需要的一个文件,--."而后,"搜索助手"工具栏显示一片空白,无法使用.说明:我的系统是XP SP3. 这显然要么是进行系统"瘦身",要么就是因安装某个程序而破坏系统文件引发的Windows搜索助理功能失效. 经过查询,得知解决方法主要有以下三个:       第一种办法是打开文件夹"C:/Windows/inf",找到"srch