Javascript 匿名函数、作用域和变量 功能升级车间(){ var选择指数; var类别_BTN=[]; 对于(变量i=0;i

Javascript 匿名函数、作用域和变量 功能升级车间(){ var选择指数; var类别_BTN=[]; 对于(变量i=0;i,javascript,Javascript,我有一个名为Button的自定义类,我想创建其中的5个。我给了他们每个人一个动作变量,当检测到点击时执行 变量selectedIndex以及方法draw\u ui可以在我声明这些函数的类中找到,not按钮类。我注意到仅仅调用draw\u ui()是找不到的,而this.draw\u ui()试图在Button类中找到方法。如何断言函数调用和变量赋值指向定义类?对于问题的第一部分,请参见以下答案:因为这是一个非常常见的问题,已经被问了很多次(如果您不知道搜索什么,搜索并不总是很容易找到) 对于问题

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


变量
selectedIndex
以及方法
draw\u ui
可以在我声明这些函数的类中找到,not按钮类。我注意到仅仅调用
draw\u ui()
是找不到的,而
this.draw\u ui()
试图在Button类中找到方法。如何断言函数调用和变量赋值指向定义类?

对于问题的第一部分,请参见以下答案:因为这是一个非常常见的问题,已经被问了很多次(如果您不知道搜索什么,搜索并不总是很容易找到)

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

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(){
       ...
    }
}
功能升级车间(){
var选择指数;
var类别_BTN=[];
var self=这个;
对于(变量i=0;i<5;i++){
(功能(索引){
类别BTN[索引]=新按钮(38,68+i*75284,70);
类别\u btns[索引]。操作=函数(){
selectedIndex=索引;
self.draw_ui();//在此处使用self
};
})(i) );
}
this.draw_ui=函数(){
...
}
}

这是一个重复的问题,关于在事件处理程序中使用
for
循环索引值的问题被问了无数次。我现在查一下原件。谢谢,这回答了我的一个问题。但是,我仍然在第二个问题上寻找答案。问题的第二部分要求在函数之前将
this
保存在局部变量中,以便您可以引用该值来执行
draw_ui()
,因为
this
将在您分配给
的函数中具有不同的值。action
。Put
var self=this
for
循环上方,然后引用
self.draw_ui()
。仅供参考,我重新打开了dup,因为您有多个问题,dup只回答了第一部分。为完整起见,我还将
for
循环闭合解决方案放在这里,尽管该部分是引用问题的dup。
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(){
       ...
    }
}