Recursion 一次又一次地用重复数据填充结构

Recursion 一次又一次地用重复数据填充结构,recursion,coldfusion,Recursion,Coldfusion,考虑以下代码: <cfset result.enrollments = {} /> <cfset result.enrollments = getCorrectionList(SESSION.id,SESSION.term) /> <cfdump var="#result#" /><Cfabort/> <cffunction name="getCorrectionList"> <cfargument name="id"

考虑以下代码:

<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 --->

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

然后,我获得第二个结构输出,其中包含键
注册
消息
、和
状态
。在
注册
键内是另一个结构,其中包含
注册
消息
状态
。在该
注册
键中是另一个具有相同键的结构,以此类推50次,最后一个结构为空

似乎正在进行一些递归操作,但在哪里/如何进行


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

我不知道为什么利和斯科特都没有给出他们的评论答案,但他们都是对的

您对
结果的引用超出了您的职能范围:

<cfset result.enrollments = getCorrectionList(SESSION.id,SESSION.term) />
或者明确地将它们放在
本地
范围内:

<cfset local.result = {} />

但这不是你在这里要做的。本地化函数的变量。

(编辑)这是因为在函数内外都使用了名为“result”的结构变量。由于函数内部的变量没有本地化,因此您实际上是在捕捉函数本身内部的结果。从而创建一个循环引用。这就是垃圾场。解决方案是将函数局部变量本地化。有趣的是,它只出现在CF中。我看到缺少作用域做了一些奇怪的事情,但这是一个新的;-)要澄清的是,代码实际上并不是一次又一次地填充结构。看起来是这样的,因为CFDump在显示值时无法解析循环引用。您需要
var
名为
result
的变量-但我建议使用不同的名称..并且
var
It.IMO,“好的答案”应该比我的注释有更多的实质内容(最好是示例)。我决定休息一晚,但希望你能在这段时间内突然出现并发布一个更可靠的答案。。。你没有让我失望;-)嘿,很公平。我认为你的评论实际上已经足够透彻了,但它让我写得更详细,以便在答案中实际添加一个值。我的印象是,在函数中CF10默认地本地化了变量,没有必要这样做。我猜是的,但是因为我已经有了一个函数之外的结果,它正在使用那个引用,而不是创建一个新的引用?实际上,刚刚测试了我的理论,我错了。哇!我这样做已经有一段时间了,我做出了一个非常错误的假设。不管怎样,奇怪的是,我甚至没有看到结果不是本地设置的。谢谢。@Leeish-虽然变量必须是var/local作用域才能避免这个问题,但有趣的是,这种行为只发生在ACF中。Lucee和Railo都返回一个只有两个键的结构:status和message。
<cfset result.enrollments = result />
<cfset var result = {} />
<cfset local.result = {} />
<cfset variables.result = {} />