【问题标题】:Javascript Associative Array to Integer?Javascript关联数组到整数?
【发布时间】:2014-08-22 03:59:59
【问题描述】:

我正在开发大量用于实习的软件,我的任务是向系统添加功能,该系统根据现有的奖品和卡片数量构建奖励级别表。

我正在进入添加行的函数,我发现一对非常奇怪的声明。我将发布函数本身,以免缺少上下文抑制答案。 我搜索了“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 变量,一个是全局变量(它缺少var 声明)。
  • 内部闭包内的awardLevel 遮蔽了外部声明,外部声明要么在周围的构造函数代码中声明,要么隐式全局声明。
  • JavaScript 本身没有关联数组;在其他语言中类似于关联数组的是 JS 中的对象。
  • 我明白了,它被视为关联数组,所以我问了这样的问题,试图获得正确的帮助。虽然它在技术上是一个搜索 Javascript Associative Arrays 的对象,但我发现了很多语法帮助。

标签: javascript arrays types


【解决方案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);

【讨论】:

  • “从未声明过”——至少在发布的代码中没有,这显然是构造函数或类似函数的片段。它可以很容易地在其他地方声明,而不一定是全局的。
  • 是的,就是这样,该名称的变量没有其他声明,也没有从其他代码传入。可以将外部变量的空赋值视为没有“var”的声明吗?我已经搜索了与该文档交互的每个文档,并且该变量没有被传入。
  • 顺便感谢您的解释,如果我使用一种我更熟悉的语言(Java,C++),我可能会猜到同样的事情,但 Javascript 似乎从来没有强制执行规则我会期待的。更复杂的是,我实际上在 _insert_award_lvl.php 文件中使用了 awardLevel 对象的属性,这完全让我大吃一惊。我知道它不是很好,有人告诉我写它的人比我更环保。
猜你喜欢
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 2012-01-09
  • 1970-01-01
  • 2011-07-22
相关资源
最近更新 更多