【发布时间】:2026-01-10 15:50:02
【问题描述】:
考虑以下代码:
<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。在enrollments 键内是另一个结构体enrollments、message 和status。在 enrollments 键内部是另一个具有相同键的结构,依此类推 50 次,最后一个结构为空。
似乎正在进行一些递归操作,但在哪里/如何?
我不知道发生了什么。正如您从我的代码中看到的那样,没有循环。我知道 URL 解析正确,它返回一个查询并有一个记录数。我可以在正确的位置看到数据转储。但是函数中的#result# 如何显示单个结构,而函数外部的#result# 显示重复自身的 50 深结构。这没有任何意义。
【问题讨论】:
-
(编辑)这是因为您在函数内部和都使用了一个名为“result”的结构变量。由于函数内部的变量未本地化,因此您实际上是在捕获函数的结果 - 在其内部。从而创建一个循环引用。因此转储。解决方案是本地化函数局部变量。有趣的是,它只发生在 CF 中。我已经看到缺乏范围界定做了一些奇怪的事情,但这是一个新的;-)
-
澄清一下,代码实际上并没有一遍又一遍地填充结构。看起来就是这样,因为 CFDump 在呈现值时无法解析循环引用。
-
您需要
var变量名为result- 但我建议为它使用不同的名称..和var它。
标签: recursion coldfusion