如果我有一个功能说
<cfcomponent name="details">
<cffunctiion name="getDetails" access="public" returntype="struct">
<cfscript>
var mydetails = {};
mydetails.fName='lilly';
mydetails.lName ='flower';
</cfscript>
<cfreturn mydetails >
</cffunction>
</cfcomponent>
现在我将调用此函数并返回会话变量
<cfset session.mydetails = details.getDetails()>
我在这里得到的是该函数的结构mydetails(因为它是一个复杂的对象)的参考。我相信引用将指向我调用函数时创建的内存位置,并在其中创建变量。
因为我的引用仍然通过我的新session.myDetails变量指向内存位置,所以var范围真的会被垃圾收集!
答案 0 :(得分:2)
从对象返回值时,它不会作为引用返回。试试这个:
<cfcomponent name="details">
<cffunction name="getDetails" access="public" returntype="struct">
<cfscript>
var mydetails = {};
mydetails.fName='lilly';
mydetails.lName ='flower';
mydetails.timestamp = GetTickCount();
</cfscript>
<cfreturn mydetails />
</cffunction>
</cfcomponent>
<cfset myObject = CreateObject("component", "TestComponent") />
<cfset myDetails = myObject.getDetails() />
<cfdump var="#myDetails#" label="First Request" />
<cfset otherDetails = myObject.getDetails() />
<cfdump var="#myDetails#" label="After second request" />
<cfdump var="#otherDetails#" label="otherDetails from second request" />
您会注意到myDetails的第一个和第二个转储是相同的,这意味着第二个请求(其中变量设置为“otherDetails”)不会更改“myDetails”中的原始值。这意味着返回了结构,并将其分配给变量byValue而不是byReference。
说到这一点,组件中的原始局部变量应该与组件实例本身同时进行垃圾收集,而会话中的struct在会话之前不会被垃圾收集。
答案 1 :(得分:0)
是var范围变量 (myDetails)是垃圾收集 函数调用时立即执行 完成了!或者它会等到最后 儿童变量仍然存在 提到它被删除
如果你的意思是底层结构,那就是后者。代码的第一部分在内存中创建了一个结构,但是对该结构进行了多次引用。没有任何东西被复制。因此,在最后一个引用超出范围/不可达之前,底层结构将不会符合进行垃圾收集。
// First Reference
var mydetails = {};
当cffunction
结束
<cfset variables.myDetails = myObject.getDetails() />
.cfm
脚本结束时,另一个引用超出范围
// Last Reference
session.amKeepingHer = mydetails;
最后一次参考的寿命最长。 session
结束时,它只会超出范围。所以回到最初的问题:在会话结束之前,原始结构不符合垃圾收集的条件。 jvm决定实际发生垃圾收集的时间。