匿名函数,范围和变量

时间:2014-08-16 06:54:43

标签: javascript

function UpgradeShop(){
    var selectedIndex;

    var category_btns = [];
    for(var i = 0; i < 5; i++){
        category_btns[i] = new Button(38, 68 + i * 75, 284, 70);
        category_btns[i].action = function() {
            selectedIndex = i;   // ?
            draw_ui();           // ?
        };
    }

    this.draw_ui = function(){
       ...
    }
}

我有一个名为Button的自定义类,我想创建其中的5个。我给了他们每一个在检测到点击时执行的动作变量。

变量selectedIndex以及方法draw_ui可以在我声明这些函数的类中找到,不是 Button类。我注意到无法找到简单地调用draw_ui()并且this.draw_ui()尝试在Button类中找到该方法。如何断言函数调用和变量赋值是否定向到定义类?

1 个答案:

答案 0 :(得分:2)

对于你问题的第一部分,请看这个答案:JavaScript closure inside loops – simple practical example因为这是一个非常常见的问题,这个问题已经被问了很多次(如果你不这么做的话,搜索并不总是很容易找到#39} ; t知道要搜索的内容。)

对于问题的第二部分,您需要将this的值保存在这样的局部变量中:

function UpgradeShop(){
    var selectedIndex;

    var category_btns = [];
    var self = this;
    for(var i = 0; i < 5; i++){
        (function(index) {
            category_btns[index] = new Button(38, 68 + i * 75, 284, 70);
            category_btns[index].action = function() {
                selectedIndex = index;
                self.draw_ui();           // use self here
            };
        })(i);
    }

    this.draw_ui = function(){
       ...
    }
}