我一直在查看一些工作中的旧代码,并且发现了几个嵌套循环实例,其中用于迭代对象的变量在内部循环中重新分配,但不会引起问题。例如给出以下内容example.cfm
:
<cfscript>
// Get every second value in an array of arrays
function contrivedExampleFunction(required array data) {
var filtered = [];
for (i = 1; i lte arrayLen(arguments.data); i++) {
var inner = arguments.data[i];
for (i = 1; i lte arrayLen(inner); i++) {
if (i eq 2) {
arrayAppend(filtered, inner);
}
}
}
return filtered;
}
data = [
[1,2,3],
[4,5,6],
[7,8,9]
];
// Expected (working function): [2, 5, 8]
// Expected (short-circuiting): [2]
// Actual result: [1, 2, 3]
writeDump( contrivedExampleFunction(data) );
</cfscript>
我希望内部i
声明重新分配外部声明i
并导致函数“短路”,尤其i
是甚至没有 scoped。但是,该函数将返回不可预测的结果。为什么?