请考虑以下代码:
<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
函数内的转储。
然后我使用键enrollments
,message
和status
获得第二个struct输出。 enrollments
键内部是另一个包含enrollments
,message
和status
的结构。在enrollments
键内部是具有相同键的另一个结构,所以50次,最后一个结构为空。
似乎有些递归动作正在进行但是在哪里/如何?
我不知道发生了什么事。从我的代码中可以看出,没有循环。我知道URL正确解析,它返回一个查询并有一个记录数。我可以在正确的位置看到数据转储。但是,函数中的#result#
如何显示单个结构,但函数外部的#result#
如何显示重复的结构。它没有任何意义。
答案 0 :(得分:2)
我不知道为什么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
成为离散变量,而不仅仅是对调用代码的另一个引用&#39; result
变量。
你应该总是本地化你的函数变量,除非你特意指的是引用一个调用代码变量,在这种情况下,如果你明确地将它作为明确的范围,它会使你的代码变得清晰意思是,例如:
<cfset variables.result = {} />
但这不是 你在这里做的意思。本地化您的函数变量。