我不太清楚Javascript中的变量范围

我不太清楚Javascript中的变量范围,javascript,jquery,Javascript,Jquery,抱歉,如果这看起来有点容易。我对Javascript还是比较陌生的 我正在生成一个复选框列表。在复选框的上单击,我想让它弹出关联的文本。即,名为“一”的复选框应显示“一”。在我的示例中,它只显示“2” 但是,click()回调方法只调用最后添加的复选框的文本。此处的“v”变量是否未按复选框分配?看起来“v”的行为就像一个全局变量 this.view = document.createElement("div"); var tbody = document.createElement("tbod

抱歉,如果这看起来有点容易。我对Javascript还是比较陌生的

我正在生成一个复选框列表。在复选框的上单击,我想让它弹出关联的文本。即,名为“一”的复选框应显示“一”。在我的示例中,它只显示“2”

但是,click()回调方法只调用最后添加的复选框的文本。此处的“v”变量是否未按复选框分配?看起来“v”的行为就像一个全局变量

this.view = document.createElement("div");

var tbody = document.createElement("tbody");
var popupValues = {"A", "B"};
for (var i=0;i<this.popupValues.length;i++) {
    var v = popupValues[i];

    var tr  = document.createElement('tr');
    var tdCheck  = document.createElement('td');

    var ChkBx = document.createElement('input')

    ChkBx.type = 'checkbox';

    tdCheck.appendChild(ChkBx);

    var self = this;

    $(ChkBx).live('change', function(){
        if($(this).is(':checked')){

            alert('checked' + v);
        } else {
            alert('un-checked' + v);
        }
    });


    var td  = document.createElement("td");


    td.appendChild(document.createTextNode('' + v));
    tr.appendChild(tdCheck);
    tr.appendChild(td);


    tbody.appendChild(tr);
}

table.appendChild(tbody);

document.appendChild(table)
this.view=document.createElement(“div”);
var tbody=document.createElement(“tbody”);
var popupValues={“A”,“B”};

对于(var i=0;i,您可以在SO中搜索for循环中的
事件绑定

这里有一个解决方案:

试试这个:

this.view = document.createElement("div");

var tbody = document.createElement("tbody");
var popupValues = {"A", "B"};
for (var i=0;i<this.popupValues.length;i++) {
    var v = popupValues[i];

    var tr  = document.createElement('tr');
    var tdCheck  = document.createElement('td');

    var ChkBx = document.createElement('input')

    ChkBx.type = 'checkbox';

    tdCheck.appendChild(ChkBx);

    var self = this;

    (function(val) {
      $(ChkBx).on('change', function(){
        if($(this).is(':checked')){

            alert('checked' + val);
        } else {
            alert('un-checked' + val);
        }
      });
    })(v);


    var td  = document.createElement("td");


    td.appendChild(document.createTextNode('' + v));
    tr.appendChild(tdCheck);
    tr.appendChild(td);


    tbody.appendChild(tr);
}

table.appendChild(tbody);

document.appendChild(table);
this.view=document.createElement(“div”);
var tbody=document.createElement(“tbody”);
var popupValues={“A”,“B”};
对于(var i=0;i您可以

   var table = document.createElement("table");
var tbody = document.createElement("tbody");


var popupValues = [
    "one", "two"
];

for (var i = 0; i < popupValues.length; i++) {

    var v = popupValues[i];

    var tr = document.createElement('tr');
    var tdCheck = document.createElement('td');

    var ChkBx = document.createElement('input');
    ChkBx.type = 'checkbox';
    ChkBx.value=v;
    tdCheck.appendChild(ChkBx);

    var td = document.createElement("td");
    td.appendChild(document.createTextNode('' + v));
    tr.appendChild(tdCheck);
    tr.appendChild(td);
    tbody.appendChild(tr);


    var self = this;

    $(ChkBx).click('change', function () {
        if ($(this).is(':checked')) {
            alert('check ' + $(this).val());
        } else {
            alert('un-checked');
        }
    });

}

table.appendChild(tbody);
document.body.appendChild(table)    
var table=document.createElement(“表”);
var tbody=document.createElement(“tbody”);
var popupValues=[
“一”,“二”
];
对于(var i=0;i

添加
ChkBx.value=v;
以在单击时获得类似
$(this.val()
的值

“此处的'v'变量是否未按复选框分配?”

它是赋值的,但不是为每个复选框声明的

在Javascript中,变量只有函数作用域。即使您尝试在循环的每个迭代中创建一个新变量,它也只是在函数级别声明的一个变量,由所有迭代共享。声明被提升到函数级别,只有赋值在循环内发生

您可以使用立即执行的函数表达式在循环内创建另一个作用域,在该作用域中,您可以为每个迭代创建一个新变量:

for (var i=0;i<this.popupValues.length;i++) {
  (function(v){
    // code of the loop goes in here
    // v is a new variable for each iteration
  }(popupValues[i]));
}

for(var i=0;i)你的fiddle什么都不做……你确定吗?我在使用Chrome:你没有在fiddle中启用jQuery当你的事件处理程序运行时,它当时的值是v。所以很自然,它是你留下的值(最后一个).Cheers.@oliverwatkins应该记住,
.live
自jQuery 1.7以来就被弃用,并在1中被删除。9@EduardGamonal:是的,我知道。我的浏览器在更新时由于其他操作系统、java原因崩溃了。我想我理解了。我想我被误导了,因为我假设局部变量只是局部变量。但是相对于内部变量霍德,这有点全局性,我猜这并不能回答问题,它只是避免了变量的使用。