循环内部的动态函数:i var不可见

Dynamic function inside loop: i var is not visible

本文关键字:var 内部 动态 函数 循环      更新时间:2023-09-26

查看以下代码

//btns is an array passed as a parameter to a function
for(var i = 0, b; b = btns[i]; i++) {
    b.handler = function () {
        var a = btns[i].some_field; //undefined
        //the same for "b.some_field;"
    };
}

为什么btns[i]未定义?

PS如果这很重要的话,代码会在extjs按钮上添加click处理程序。

之所以会发生这种情况,是因为当调用内部函数时(即循环完成后),i的值将是btns.length,因此btns[i]的值将为undefined

你需要像这样关闭i的值:

b.handler = function(i) {
    return function() {
        var a = btns[i].some_field;
    }
}(i);

需要注意的是,尽管变量名称相同,但它们是不同的变量;即内部变量遮蔽外部变量,从而"固定"该值。

for(var i = 0, b; b = btns[i]; i++) {
  b.handler = function () {
    var a = this.btns[i].some_field; 
    //the same for "b.some_field;"
  };
}

在函数的旁边给出"this",我们必须使用"this"来指向