Javascript 为什么可以';我向集合中的每个元素添加一个引用自身的事件,而不是“引用”中的最后一个元素;对于(){}";陈述

Javascript 为什么可以';我向集合中的每个元素添加一个引用自身的事件,而不是“引用”中的最后一个元素;对于(){}";陈述,javascript,foreach,addeventlistener,getelementsbytagname,Javascript,Foreach,Addeventlistener,Getelementsbytagname,但是,在加载窗口时,Quote\u App中的每个DD元素都应该附加一个触发函数Lorem的onCLick事件,Lorem返回For语句中最后一个元素的nodeName和Id,而不是触发函数的元素的Id。我希望Lorem返回触发函数的元素的nodeName和Id function Lorem(Control){ /* this.Control=Control; */ this.Amet=function(){ return Control.nodeName+"\

但是,在加载
窗口时,
Quote\u App
中的每个
DD
元素都应该附加一个触发函数
Lorem
onCLick
事件,
Lorem
返回
For
语句中最后一个元素的
nodeName
Id
,而不是触发函数的元素的Id。我希望
Lorem
返回触发函数的元素的
nodeName
Id

function Lorem(Control){

/*     this.Control=Control; */
    this.Amet=function(){
        return Control.nodeName+"\n"+Control.id;
    };

};

function Event(Mode,Function,Event,Element,Capture_or_Bubble){
    if(Mode.toLowerCase()!="remove"){
        if(Element.addEventListener){
            if(!Capture_or_Bubble){
                Capture_or_Bubble=false;
            }else{
                if(Capture_or_Bubble.toLowerCase()!="true"){
                    Capture_or_Bubble=false;
                }else{
                    Capture_or_Bubble=true;
                };
            };
            Element.addEventListener(Event,Function,Capture_or_Bubble);
        }else{
            Element.attachEvent("on"+Event,Function);
        };
    };
};

function Controls(){
    var Controls=document.getElementById("Quote_App").getElementsByTagName("dd");
    for(var i=0;i<Controls.length;i++){

        var Control=Controls[i];

        Event("add",function(){

            var lorem=new Lorem(Control);
            lorem.Control=Control;
            alert(lorem.Amet());

        },"click",Controls[i]);

    };
};

Event("add",Controls,"load",window);
函数Lorem(控制){
/*这个。控制=控制*/
this.Amet=function(){
返回控件.nodeName+“\n”+Control.id;
};
};
函数事件(模式、函数、事件、元素、捕捉或气泡){
if(Mode.toLowerCase()!=“删除”){
if(Element.addEventListener){
如果(!捕获\u或\u气泡){
捕获\u或\u气泡=错误;
}否则{
if(捕获\u或\u Bubble.toLowerCase()!=“true”){
捕获\u或\u气泡=错误;
}否则{
捕捉或捕捉气泡=真;
};
};
元素。addEventListener(事件、函数、捕获或气泡);
}否则{
元素.attachEvent(“on”+事件,函数);
};
};
};
函数控件(){
var Controls=document.getElementById(“Quote_App”).getElementsByTagName(“dd”);

对于(var i=0;i,在循环中需要一个闭包,在循环中附加事件处理程序以捕获每个循环迭代中的
i

  for(var i=0;i<Controls.length;i++) {   
    (function() {
        var Control=Controls[i];

        Event("add",function(){

            var lorem=new Lorem(Control);
            lorem.Control=Control;
            alert(lorem.Amet());

         },"click",Controls[i]);
    })();
  };

for(var i=0;i这可能是Russ Cam答案的一个更明显的变体:

function Controls() {
  var Controls = document.getElementById("Quote_App").getElementsByTagName("dd");

  var createHandlerFor = function(CurrentControl) {
    return function() {
      var lorem=new Lorem(CurrentControl);
      lorem.Control=CurrentControl;
      alert(lorem.Amet());
    }
  };

  for (var i=0; i<Controls.length; i++) {
    Event("add", createHandlerFor(Controls[i]), "click", Controls[i]);
  }
};
函数控件(){
var Controls=document.getElementById(“Quote_App”).getElementsByTagName(“dd”);
var createHandlerFor=函数(CurrentControl){
返回函数(){
var lorem=新的lorem(电流控制);
lorem.Control=电流控制;
警报(lorem.Amet());
}
};

对于(var i=0;i当您创建一个引用其外部变量的函数时,这些引用将在您调用此函数时解析

function Lorem(Control){

/*     this.Control=Control; */
    this.Amet=function(){
        return Control.nodeName+"\n"+Control.id;
    };

};

function Event(Mode,Function,Event,Element,Capture_or_Bubble){
    if(Mode.toLowerCase()!="remove"){
        if(Element.addEventListener){
            if(!Capture_or_Bubble){
                Capture_or_Bubble=false;
            }else{
                if(Capture_or_Bubble.toLowerCase()!="true"){
                    Capture_or_Bubble=false;
                }else{
                    Capture_or_Bubble=true;
                };
            };
            Element.addEventListener(Event,Function,Capture_or_Bubble);
        }else{
            Element.attachEvent("on"+Event,Function);
        };
    };
};

function Controls(){
    var Controls=document.getElementById("Quote_App").getElementsByTagName("dd");
    for(var i=0;i<Controls.length;i++){

        var Control=Controls[i];

        Event("add",function(){

            var lorem=new Lorem(Control);
            lorem.Control=Control;
            alert(lorem.Amet());

        },"click",Controls[i]);

    };
};

Event("add",Controls,"load",window);
就你而言:

var functions = [];
function outer() {
    for (var i = 0; i < N; i++) { // <------------
        functions[i] = function() { //            |
            alert(i); // <-- this 'i' refers to this one
        }
    } // At the end of the for loop, i == N (or N+1?)
}
functions[x](); // Will show N (or N+1)
// because that's the current value of i in the outer function
// (which is kept alive just because something refers to it)
var函数=[];
函数外部(){

对于(变量i=0;iFor
循环是个问题。你的解决方案很完美,所以谢谢你。其他类似情况的人可能会找到一本有趣的书。你太棒了,再次谢谢n!谢谢,收到提示!我知道Internet Explorer不支持捕获或气泡布尔值。我包含它是为了制作一个完整的跨浏览器功能。但我明白你的意思,你不能制作一个跨浏览器应用程序。这需要捕获。我包含它是为了W3C标准。关于外壳,这是我个人的事情,所以我知道什么是我的,什么是默认方法。另外,如果我不小心将变量命名为与默认方法相同的变量,这会有所帮助,因为Javascript是区分大小写的。我希望这是有意义的。你认为我应该始终使用驼峰式大小写作为良好实践吗?@user311403-我会使用你觉得合适的大小写和/或使用过的任何标准在你和你的同事之间达成一致意见。不过,在我看来,使用骆驼套是一个好习惯,因为它通常是标准的,因此如果你把你的技能带到其他地方,这将是一个无痛的过渡:)至于
Capture\u或\u Bubble
,我倾向于将其全部取出,只需在函数中添加
addEventListener(事件、函数、false);
。@Russ:我想这取决于你的心态。:)如果您关注的是循环,我发现将闭包分开并为其命名会很有帮助,而不是使用匿名函数。这样,循环体看起来更直接。