2017-12-15 38 views
5

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

  1. 는 구조체를 INITING
  2. 는 전 세계적으로 accessable 한 있도록 다음은 동작을 복제 할 수있는 코드입니다 (local.data)
  3. _append 함수에 데이터를 호출하여 첫 ​​번째 필드 항목 (name) 추가
  4. 두 번째 필드 항목 (전화)을 th 전자 같은 방법으로

이 코드는 다음과 같은 결과가 발생합니다 : 당신이 볼 수 있듯이

Dump of output

는 중복 된 항목과 배열의 코드 결과는 예상 할 수 때 최초의 인덱스 field = "name"이어야합니다. 두 번째로 _append하도록 호출 된 데이터의 값에는 값 "name"이있는 "field"속성이 포함되어 있습니다. 우리가 함수를 처음으로 호출했을 때부터 인수 범위에 머물러있는 것처럼 보입니까? 이것이 어떻게 가능한지. 인수 범위가 cffunction 태그 내부로 격리되어 있다고 생각했습니다.

하지만이 함께 _append 기능을 대체 할 경우 :

Dump of output 2

당신이 볼 수 있듯이 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> 

충분하지 않았습니다.

누군가이 인수 범위의이 동작을 설명 할 수 있습니까?

답변

4

그래서 몇 가지 조사 후, 나는이 어도비 ColdFusion 설명서 페이지에 (나에 의해 수행 텍스트의 굵은 글꼴) 발견 :

모든 함수 인수는 자신의 범위에 존재하는 인수 범위에 대해

을의 인수 scope. 인수 범위는 함수 호출의 수명 동안 존재합니다. 함수가 반환되면 범위와 해당 변수가 삭제됩니다. 그러나 인수 범위를 삭제해도 구조체 또는 쿼리 객체와 같이 ColdFusion에서 참조로 함수에 전달하는 변수는 삭제되지 않습니다. 함수 인수로 사용하는 호출 페이지의 변수는 계속 존재합니다. 함수가 인수 값을 변경하면 호출 페이지의 변수에 변경된 값이 반영됩니다.

이 나를 위해 눈 오프너이었다, 그리고 참조

+0

네, 가장 복잡한 객체가 전달됩니다 :) 미래의 문제에서 저를 유지합니다. 배열은 이상한 예외입니다. 대부분의 경우 그들은 "가치에 의해"전달됩니다. 따라서 _append와 같은 udf는 해당 함수 외부의 배열 상태를 수정할 수 없습니다. – Ageax

+0

참조로 배열이 필요한 경우 Java의 ArrayList ('createObject ("java,"java.util.ArrayList "). init()')를 사용할 수 있습니다. – Alex