在函数内部声明的数组是静态的吗?

时间:2019-01-01 12:31:13

标签: javascript arrays

所以我的问题是我在一个函数中有2个声明的数组。每次我调用此函数时,它都会从两个数组中删除一项。下次调用该函数时,元素将在保留之前被删除。

现在我知道问题出在哪里了,我知道我在函数调用中声明了相同的数组,但是我想要使这些数组成为静态的,并且我知道如果我在函数外声明了2个数组,它将完美地锻炼。

但是我不得不让那些在函数内部声明的数组。那么请问有什么办法可以做到这一点?这是我的代码:

function Tirage(){
  var Binomes=['George','Davide','Anna','Martin','Lucy','Nancy'];
  var Projet=['Foundation','Skeleton','Bootstrap','UIkit','Base','W3.CSS'];

  var c1=parseInt((Math.random())*(Binomes.length));
  var c2=parseInt((Math.random())*(Projet.length));

  Binomes.splice(c1,1);
  Projet.splice(c2,1);

  alert(c1+"\n"+Binomes);
  alert(c1+"\n"+Projet);

}

EDIT 最初的代码是这个,并且不允许我更改它或在功能之外添加其他代码:

function Tirage(){
     var Binomes=['George','Davide','Anna','Martin','Lucy','Nancy'];
     var Projet=['Foundation','Skeleton','Bootstrap','UIkit','Base','W3.CSS'];

     //Complete Code here
}

编辑2

似乎这个问题是无法理解的,这是我的错,所以练习需要我创建一个“随机绘制”并将我绘制的内容插入表中的行中。实现此功能的函数内部有2个贴花的数组,我必须从每个数组中随机绘制一个元素,并将其作为具有2个单元格的行插入表中。

因为我对本练习的理解不佳,所以我认为该函数在每个函数调用中仅绘制一次,这意味着如果我第一次单击,我只会绘制一次并将该绘制插入表格中,那么第二次是相同的事情,只是避免画出表中已经插入的内容。

对此感到抱歉,原来的问题已经在下面回答

3 个答案:

答案 0 :(得分:1)

看到您在评论中链接的the document的练习3,我注意到您被要求编写一个函数,该函数将一次使所有连接 ,只需要一个 调用该函数。并且它应该填充表格。

在这种情况下,请按照以下步骤操作:

function Tirage() {
    var Binomes=['George','Davide','Anna','Martin','Lucy','Nancy'];
    var Projet=['Foundation','Skeleton','Bootstrap','UIkit','Base','W3.CSS'];

    // Get a reference to the table 
    var table = document.getElementById("IADO");
    // Remove the tbody element if it exists. This is to remove the previous result if there is one.
    if (table.children.length > 1) table.removeChild(table.children[1]);
    // Regenerate a new tbody element
    var tbody = table.appendChild(document.createElement("tbody"));
    
    while (Binomes.length && Projet.length) {
        var c1 = Math.floor(Math.random() * Binomes.length);
        var c2 = Math.floor(Math.random() * Projet.length);
        // Add the corresponding 2 values as a pair in the output array:
        var row = tbody.insertRow(-1);
        var cell = row.insertCell(-1);
        cell.textContent = Binomes.splice(c1,1)[0];
        cell = row.insertCell(-1);
        cell.textContent = Projet.splice(c2,1)[0];
    }
}
.CSSTableGenerator { width: 100% } 
<fieldset>
    <legend>Master</legend>
    <fieldset>
        <legend><button onclick="Tirage()">Start</button></legend>

        <table id="IADO" style="border-collapse: collapse;" class="CSSTableGenerator">
            <thead><!-- header of the table -->
                <tr style="border: 1px solid black;">
                    <th style="border: 1px solid black;">Name</th>
                    <th style="border: 1px solid black;">Framework</th>
                </tr>
            </thead>
        </table>
    </fieldset>
</fieldset>

旁注:请不要在已经是数字的数字上使用parseInt。它将使数字成为字符串,然后使字符串再次成为数字。请改用Math.floor

答案 1 :(得分:0)

这取决于您当前所处的环境。如果您的上下文DrawItem是某个类的实例,则只需将数组添加为实例的属性。

但是,我假设您不在实例中,因此ComboBox可能会引用this对象。

this

答案 2 :(得分:0)

我在这里提出的解决方案可能会有些混乱。 似乎甚至可以回答这里提出的问题,因为我们希望继续选择将所有代码放入执行操作的函数中。 显然,两个变量Tirage.arrayC1Tirage.arrayC2是全局变量,但是它们在函数内部声明并且在函数的范围之内。

通过验证它们是否不值得undefined的条件,可以精确地将其值丢失给函数的各种执行。

函数第一次被调用时,它们肯定是“ undefined”,这是声明它们并拥有空白面板的最佳时机。

希望对您有帮助。

function Tirage(){
  if(Tirage.arrayC1 == undefined || Tirage.arrayC2 == undefined){
   Tirage.arrayC1 = [];
    Tirage.arrayC2 = [];
  }
  var Binomes=['George','Davide','Anna','Martin','Lucy','Nancy'];
  var Projet=['Foundation','Skeleton','Bootstrap','UIkit','Base','W3.CSS'];
  
  var c1=parseInt((Math.random())*(Binomes.length));
  var c2=parseInt((Math.random())*(Projet.length));
  
  Tirage.arrayC1.push(c1);
  Tirage.arrayC2.push(c2);
  
  for(var i=0; i<Tirage.arrayC1.length;i++){
    Binomes.splice(Tirage.arrayC1[i],1);
    Projet.splice(Tirage.arrayC2[i],1);
  }
  
  console.log(Binomes);
  console.log(Projet);
}



Tirage();
Tirage();
Tirage();
Tirage();
Tirage();
Tirage();
Tirage();
Tirage();