一遍又一遍地填充重复数据的结构

Struct being populated with duplicate data over and over

考虑以下代码:

<cfset result.enrollments = {} />
<cfset result.enrollments = getCorrectionList(SESSION.id,SESSION.term) />
<cfdump var="#result#" /><Cfabort/>


<cffunction name="getCorrectionList">
    <cfargument name="id" required="true" type="string" />
    <cfargument name="term" required="true" type="numeric" default="#getCurrentSemester().code#" />

        <cfset result = {} />
        <cfset result.status = 500 />
        <cfset result.message = 'Unknown Error' />

        <cfhttp url="THERE IS A REAL URL HERE" />
        <cfif cfhttp.statusCode EQ '200 OK'>
            <cfset courses = deserializeJson(cfhttp.fileContent,false) />

            <cfif courses.recordCount EQ 0>
                <cfset result.message = 'You are not currently enrolled in any courses for #ARGUMENTS.term#' />
                <cfdump var="#result#" />
                <cfreturn result />
            </cfif>
<!--- MORE STUFF --->

现在,当它运行时,我得到一个带有两个键 messagestatus 的结构输出。这是来自 getCorrectionList 函数内部的转储。

然后我得到第二个结构输出,其中包含键 enrollmentsmessagestatus。在 enrollments 键内是另一个结构 enrollmentsmessagestatus。在 enrollments 键内是另一个具有相同键的结构,依此类推 50 次,最后一个结构为空。

似乎正在进行一些递归操作,但是 where/how?

我不知道发生了什么。正如您从我的代码中看到的那样,没有循环。我知道 URL 正确解析并且它 returns 是一个查询并且有一个记录数。我可以在正确的位置看到数据转储。但是函数中的 #result# 怎么会显示单个结构,而函数外部的 #result# 怎么会显示一个 50 深的结构重复自己。这没有任何意义。

我不知道为什么 Leigh 或 Scott 都没有真正回答他们的评论,但他们都是对的。

您在函数外引用了 result

<cfset result.enrollments = getCorrectionList(SESSION.id,SESSION.term) />

在你的函数结束时你这样做:

<cfreturn result />

这实际上意味着您正在这样做:

<cfset result.enrollments = result />

意思是 result.enrollments 是对其父 result 的引用。

并且 <cfdump> 正确显示循环引用。

正如他们所说,您需要通过 var 对它们进行本地化:

<cfset var result = {} />

或者明确地将它们放在 local 范围内:

<cfset local.result = {} />

这将使函数的 result 成为离散变量,而不仅仅是调用代码的另一个引用 result 变量。

你应该总是 本地化你的函数变量,除非你特别想引用一个调用代码变量,在这种情况下,如果你明确地将它的范围限定为让你的意思一目了然,例如:

<cfset variables.result = {} />

但这不是您在这里的意思。本地化函数的变量。