我正在测试一个我编写的格式化时间间隔的小片段(例如last change 5m23s ago
),并不断收到我无法理解的错误。每次我尝试直接在调用i
中使用循环变量ts()
时,ASP都会通知我An error occurred...
'the function
function ts(s)
dim m: m = CLng(s \ 60): s = s mod 60
dim h: h = CLng(m \ 60): m = m mod 60
ts = right("00" & h, 2) & "h" & _
right("00" & m, 2) & "m" & _
right("00" & s, 2) & "s"
end function
'the test
for i = 0 to 90000 step 15
' response.write i & ": " & ts(i) & "<br />" 'an error has occurred
dim j: j = i : response.write i & ": " & ts(j) & "<br />" 'works fine
next
这到底是怎么回事?
为什么ts(i)
每次都会产生错误?
鉴于此,j=i : ts(j)
为什么工作正常?
变量i
不会有问题,因为它可以在write调用中正常工作。这是我尝试过的其他方法:
response.write i & ": " 'no problem
'response.write ts(i) 'crashes
'dim x: x = ts(i) 'crashes
dim j: j = i 'no problem
dim x: x = ts(j) 'works
response.write x & "<br />" 'works
'response.write ts(j) & "<br />" 'also works
'response.write i & ": " & ts(j) & "<br />" 'also works
(最后,我知道有一种方法可以使IIS显示真正的错误。我很想听听如何在不使用RDP访问Web服务器的情况下做到这一点。)
答案 0 :(得分:1)
omegastripes吸引了我。
显然,在VBScript中,默认设置是将参数传递ByRef
权限。
(从字面上看,我曾经使用过的所有其他编程语言都会传递原语ByVal
ue)
当我在函数内部更改s
的值时,这引起了一个问题。
这些片段中的任何片段都可以正常工作:
function ts(ByVal s)
...
...
ts(i)
function ts(sec)
dim s: s = sec
...
...
ts(i)
(或,如OP中所述,将值传递到非循环迭代器变量中)
function ts(s)
...
dim j: j = i: ts(j)