CFSCRIPT - For循环递增索引错误

sdi*_*iri 2 coldfusion scope for-loop coldfusion-2016

我可能在ColdFusion 2016中发现了一个错误.我有两个功能.第一个循环从1循环到n,并将第二个函数(也是数组)的返回值推送到数组中.我注意到了; index值为1,调用函数并将值推入数组,索引值为循环的结束值.这是一个错误吗?

<cfscript>
public array function fnc1(required array p1, required array p2, required numeric pSize, required numeric qSize, required numeric dSize){
iterationNum = pSize/2;
point = randRange(1, qSize-1);
for(i = 1; i <= iterationNum; i++){
    writeOutput(i); // prints: 1
    pop[i] = fnc2(p1[i], p2[i], point);
    writeOutput(i); // prints: iterationNum value
    writeDump(var = pop[i], label = "pop-"&i);
}
writeDump(var = pop, label="pop");
}

public array function fnc2(required array p1, required array p2, required numeric point){
n = arrayLen(p1);
concatArr = arrayNew(1);
for(i = 1; i <= point; i++){
    concatArr[i] = p1[i];
}
for(i = point + 1; i <= n; i++){
    concatArr[i] = p2[i];
}
writeDump(var=concatArr, label="Concated Array");
return concatArr;
}
</cfscript>
Run Code Online (Sandbox Code Playgroud)

Jam*_*ler 5

a内部变量的默认范围cfc不仅仅是函数.但它更广泛的是cfc.这通常是有问题的.

同样,a之外的变量的默认范围cfc是请求范围.这通常很有用.

两种方法

有两种方法可以限制变量的范围cfc.一种是使用关键字var,另一种是使用local.

关于它们如何不同,这是一个很长的故事.下面的示例解决方案始终使用var.如果您想了解有关varvs的更多信息local.,请单击此处:范围:Local vs Var

<cfscript>
public array function fnc1(required array p1, required array p2, required numeric pSize, required numeric qSize, required numeric dSize){
   var iterationNum = pSize/2;
   var point = randRange(1, qSize-1);
   for(var i = 1; i <= iterationNum; i++){
       writeOutput(i); // prints: 1
       pop[i] = fnc2(p1[i], p2[i], point);
       writeOutput(i); // prints: iterationNum value
       writeDump(var = pop[i], label = "pop-"&i);
   }
   writeDump(var = pop, label="pop");
}

public array function fnc2(required array p1, required array p2, required numeric point){
   var n = arrayLen(p1);
   var concatArr = arrayNew(1);
   for(var i = 1; i <= point; i++){
      concatArr[i] = p1[i];
      }
   for(var ii = point + 1; ii <= n; ii++){
      concatArr[ii] = p2[ii];
      }
   writeDump(var=concatArr, label="Concated Array");
   return concatArr;
   }
</cfscript>
Run Code Online (Sandbox Code Playgroud)