我正在为实习工作开发大量软件,我的任务是向系统添加功能,该系统根据现有奖品和纸牌数量构建奖品级别表。

我进入添加行的函数,并且发现一对极其奇怪的声明。我将发布函数本身,以免缺少上下文抑制答案。
我已经搜索了“ cast”,“ array”和“ number”的各种组合,但似乎与这种做法无关。

this.addNewTableRow = function(){
    var request = new XMLHttpRequest();
    awardLevel = this.length + 1;
    request.onreadystatechange = function(){
        if (request.readyState == 4 && request.status == 200){
            if(request.responseText != -1){
                var tableBody = document.getElementById('award-body');
                var sqlId = parseInt(JSON.parse(request.responseText));

                var prevSelector = document.getElementById('level-select-'+self.length);
                var prevLevel = 0;
                if(prevSelector != null){
                    prevLevel = parseInt(prevSelector.value);
                }

                var minCardQuantity = prevLevel + 1;
                var maxCardQuantity = minCardQuantity + 100;

                var awardLevel = {
                    id: sqlId,
                    awardId: 0,
                    certificateId: 0,
                    awardLvl: self.length + 1,
                    cardQuantity: minCardQuantity
                };

                self.changeLevelSelect(self.length + 1, minCardQuantity);

                var row = self.getRow(awardLevel, minCardQuantity, maxCardQuantity);

                tableBody.appendChild(row);
                self.awards[length] = awardLevel;
                self.length++;
            }
        }
    }
    request.open('GET', '_insert_award_lvl.php?level=' + awardLevel, true);
    request.send();
    location.reload();
}


让我感到困惑的行为是对AwardLevel的处理

在声明之前已对其进行了修改,即使对提升的理解不够明确,我也不认为该方法可行。此外,早期赋值运算符似乎是将变量赋给Int,而稍后将其赋值并用作关联数组。

整个代码有很多意想不到的混乱行为,而我对Javascript并不熟悉。

最佳答案

外部awardLevel变量不会“在声明之前进行修改”:从未声明过。另一个声明仅对其声明的功能有效(并且遮盖了外部的声明)。

这表示 :


您有两个具有相同名称和语义的不同变量(一个是整数,一个是对象)
其中一个永远不会被声明(它是全局的),并且在内部范围中被声明的一个阴影
awardLevel具有名为awardLvl的属性的事实并没有使它变得更好
这是一个不好的粗心代码


一种使所有这些稍微减少混乱的方法是:

// awardLevel = this.length + 1; remove that line
request.onreadystatechange = function(){
    // don't change which is here
}
request.open('GET', '_insert_award_lvl.php?level=' + (this.length + 1), true);

09-25 15:20