ByVal - 함수에 넘겨준 매개 변수 값이 함수 안에서 변하더라도 매개 변수 값은 변하지 않는다.
ByRef - 함수에 넘겨준 매개 변수 값이 함수 안에서 변하면, 매개 변수 역시 값이 변한다.
Asp에서는 주로 생략해서 사용하고, 기본적으로 ByVal이 적용되는 걸 알 수 있다.
함수안에 변수인 testNum1, testNum2를 Num1, Num2로 바꿔도 같은 결과가 나온다.
<%
Dim Num1, Num2
Num1 = 10
Num2 = 20
Function Test_Return(ByVal tesNum1, ByRef tesNum2)
Test_Return = tesNum1 + tesNum2
tesNum1 = 30
tesNum2 = 50
End Function
Response.Write Test_Return(Num1, Num2) &"<br>"
Response.Write Num1 &"<br>"
Response.Write Num2 &"<br>"
%>
ASP에서 사용되는 Visual Basic Procedure에서는 변수를 입력받을 때 다음 두가지 모드로 받을 수 있다.
ByRef : 호출된 프로시저가 호출 코드에서 내부 인수로 사용하는 변수의 값을 변경할 수 있도록 하는 방식으로 인수가 전달되도록 지정합니다.
ByVal : 호출된 프로시저나 속성은 호출 코드에서 내부 인수로 사용하는 변수의 값을 변경할 수 없도록 하는 방식으로 인수가 전달되도록 지정합니다.
음. 다음과 같이 쓰일 수 있다는 의미라고 보면 된다.
'// ■■ 레코드셋으로부터 Option Source를 구하는 프로시저 ■■
Function MakeOptionSourceFromRecSet(ByRef RecSet,Objnm,FirstValue)
Dim ReturnSource
Dim ArrV,ArrN
If RecSet.EOF Then
ReturnSource = ""
Else
... 중략 ...
RecSet.close
Set RecSet = Nothing
MakeOptionSourceFromRecSet = ReturnSource
End Function
위와 같은 소스에서 RecSet 레코드셋을 변수로 받았다면 ByRef로 받았을 때 프로시저 안에서 해당 레코드셋을 닫으면 실 소스에서 닫을 수 없다.
예를 들어
qrystr = "select code, name from sale"
set Res = Conn.Execute(qrystr)
optionSrc = MakeOptionSourceFromRecSet(Res, "code", "A")
Res.close
Set Res = nothing
위와 같이 하면 에러가 난다는 얘기다. Res라는 변수는 MakeOptionSourceFromRecSet라는 프로시저에 주소값을 직접 참조하는 형태로 넘어갔고, 해당 프로시저 내에서 이미 Nothing 시켜주었기 때문이다.
[출처] http://monorism.com/zbxe/?mid=board&listStyle=webzine&document_srl=5413