저는 ColdFusion을 15 년 넘게 프로그래밍했지만이 문제를 결코 경험하지 못했습니다. 내가 뭘함수 밖에서 생존하는 coldfusion 인수의 이상한 동작은 무엇입니까?
<cfset _run()>
<cffunction name="_run">
<cfset variables.dataArray=ArrayNew(1)>
<cfset local.data={
area="profile"
}>
<cfset _append(data=local.data,field="name")>
<cfset _append(data=local.data,field="phone")>
<cfdump var="#variables.dataArray#" label="dataArray">
</cffunction>
<cffunction name="_append">
<cfargument name="data" type="struct" required="yes">
<cfargument name="field" type="string" required="yes">
<cfdump var="#arguments#" label="arguments">
<cfset arguments.data.field=arguments.field>
<cfset ArrayAppend(variables.dataArray,arguments.data)>
</cffunction>
당신이 볼 수 있듯이된다 : 변수 범위의 배열을 INITING
- 는 구조체를 INITING
- 는 전 세계적으로 accessable 한 있도록 다음은 동작을 복제 할 수있는 코드입니다 (local.data)
- _append 함수에 데이터를 호출하여 첫 번째 필드 항목 (name) 추가
- 두 번째 필드 항목 (전화)을 th 전자 같은 방법으로
이 코드는 다음과 같은 결과가 발생합니다 : 당신이 볼 수 있듯이
는 중복 된 항목과 배열의 코드 결과는 예상 할 수 때 최초의 인덱스 field = "name"이어야합니다. 두 번째로 _append하도록 호출 된 데이터의 값에는 값 "name"이있는 "field"속성이 포함되어 있습니다. 우리가 함수를 처음으로 호출했을 때부터 인수 범위에 머물러있는 것처럼 보입니까? 이것이 어떻게 가능한지. 인수 범위가 cffunction 태그 내부로 격리되어 있다고 생각했습니다.
하지만이 함께 _append 기능을 대체 할 경우 :
당신이 볼 수 있듯이 arguments.data의 중복을 :
<cffunction name="_append">
<cfargument name="data" type="struct" required="yes">
<cfargument name="field" type="string" required="yes">
<cfdump var="#arguments#" label="arguments">
<cfset local.data=Duplicate(arguments.data)>
<cfset local.data.field=arguments.field>
<cfset ArrayAppend(variables.dataArray,local.data)>
</cffunction>
그것은 다음과 같은 출력을 줄 것이다 "필드"를 추가하기 전에 문제를 해결합니다. 단지 다음과 같이하십시오.
<cfset local.data=arguments.data>
충분하지 않았습니다.
누군가이 인수 범위의이 동작을 설명 할 수 있습니까?
네, 가장 복잡한 객체가 전달됩니다 :) 미래의 문제에서 저를 유지합니다. 배열은 이상한 예외입니다. 대부분의 경우 그들은 "가치에 의해"전달됩니다. 따라서 _append와 같은 udf는 해당 함수 외부의 배열 상태를 수정할 수 없습니다. – Ageax
참조로 배열이 필요한 경우 Java의 ArrayList ('createObject ("java,"java.util.ArrayList "). init()')를 사용할 수 있습니다. – Alex