Javascript关联数组到整数?

时间:2014-07-01 14:31:36

标签: javascript arrays types

我正在为实习工作一大堆软件,我的任务是为系统增加功能,根据现有的奖品和卡片数量建立一个奖励等级表。

我进入添加行的功能,我发现了一对非常奇怪的声明。我将发布该功能本身,以免缺乏上下文抑制答案。 我已经搜索过" cast"," array"的各种组合。和"数字"但似乎没有任何东西与这种做法有关。

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();  
}

令我困惑的行为是奖励等级的处理

在宣布之前对其进行了修改,即使对悬挂的模糊理解我也认为不应该有效。此外,早期赋值运算符似乎将变量赋值给Int,而后者则将其赋值并用作关联数组。

整体代码有很多意外和混乱的行为,而且我对Javascript已经缺乏经验。

1 个答案:

答案 0 :(得分:1)

外部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);