zoukankan      html  css  js  c++  java
  • JavaScript闭包

    百度这样说:

    要执行的代码块(由于自由变量的存在,相关变量引用没有释放)和为自由变量提供绑定的计算环境(作用域)。

    经过一番学习,自己写了一个,下面是HTML:

    <div>列表中的第1个div</div>
    <div>列表中的第2个div</div>
    <div>列表中的第3个div</div>
    <div>列表中的第4个div</div>
    <div id="msg"></div>

    我将给每个div绑定一个onmouseover事件,这个是错误的JavaScript:

    var el = document.getElementsByTagName("div");
    var msg = document.getElementById("msg");
    for(var i = 0;i < el.length;i ++){
    el[i].onmouseover
    = function(){
    //随机颜色
    var t = '#'+('00000'+(Math.random()*0x1000000<<0).toString(16)).slice(-6);
    msg.style.color
    = t;
    msg.innerHTML
    = "您划过了第" + (i + 1) + "个div标签";
    };
    }

    结果是每次都是第6个:

    错误的结果

    修改后的js:

    var el = document.getElementsByTagName("div");
    var msg = document.getElementById("msg");
    for(var i = 0;i < el.length;i ++){
    //闭包从这里开始
    (function(){
    var d = i;
    el[d].onmouseover
    = function(){
    //随机颜色
    var t = '#'+('00000'+(Math.random()*0x1000000<<0).toString(16)).slice(-6);
    msg.style.color
    = t;
    msg.innerHTML
    = "您划过了第" + (d + 1) + "个div标签";
    };
    })();
    //闭包到这里结束
    }

    将当前的i赋值给d,d声明在一个匿名函数里,并执行了这个匿名函数。

    ------------------------------------------------------------------

    新说:2010-09-07补充

    上面的脚本完全可以这样写:

    var el = document.getElementsByTagName("div");
    var msg = document.getElementById("msg");
    for(var i = 0;i < el.length;i ++){
    (function(d){
    el[d].onmouseover
    = function(){
    var t = '#'+('00000'+(Math.random()*0x1000000<<0).toString(16)).slice(-6);
    msg.style.color
    = t;
    msg.innerHTML
    = "您划过了第" + (d + 1) + "个div标签";
    };
    })(i);
    //变化在这里,以变量的方式传参进去  
    }

  • 相关阅读:
    [CSP-S模拟测试]:影子(并查集+LCA)
    [CSP-S模拟测试]:夜鹰与玫瑰(数学)
    [CSP-S模拟测试]:抛硬币(DP)
    [CSP-S模拟测试]:影魔(树状数组+线段树合并)
    [CSP-S模拟测试]:队长快跑(DP+离散化+线段树)
    [CSP-S模拟测试]:玄学题/c(数学)
    [CSP-S模拟测试]:卡常题/b(基环树+DP)
    [CSP-S模拟测试]:工业题/a(数学)
    BZOJ5297 [Cqoi2018]社交网络 【矩阵树定理】
    BZOJ5300 [Cqoi2018]九连环 【dp + 高精】
  • 原文地址:https://www.cnblogs.com/ShepherdIsland/p/1765836.html
Copyright © 2011-2022 走看看