在经典的ASP函数中,当我在另一个循环中执行循环时,如下面的代码所示,我有一个堆栈溢出错误。
Function shift(x,y)
shift = x
For i = 1 to y
shift = shift*2
Next
End Function
Function translate_url(iVal)
sAlpha = "abcdefghijklmnopqrstuvwxyz-_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
doWrite = False
iBase = 63 'DO NOT CHANGE
For i = 4 to 0 step -1
iPos = (iVal and shift(iBase, i*6))/shift(1, i*6)
If iPos Then doWrite = True
If doWrite Then translate_url = translate_url & Mid(sAlpha, iPos + 1,1)
Next
End Function
arr = Split("1,2,3,4,5,6,7,8,9,0",",")
For Each i In arr
response.Write(translate_url(arr(i)))
next
当我删除函数外部的循环时,不会发生错误。例如:
response.Write(translate_url(arr(1)))
返回“c”。
我需要做些什么才能让代码沿着数组向下流动并根据函数返回相应的值?
答案 0 :(得分:3)
VBScript有一个黑暗的一面。变量范围就是其中之一。
如果您没有声明变量,VBScript将为您免费或出错并为其提供全局范围。
这是什么意思?看一下主循环:
For Each i In arr
response.Write(translate_url(arr(i)))
next
i
变量变为全局变量。稍后在函数中有这个:
For i = 4 to 0 step -1
'...
Next
它正在改变相同的i
变量。这导致无限循环的函数调用。
要解决此问题,请在每个函数中本地声明i
:
Function shift(x,y)
Dim i
'...
End Function
Function translate_url(iVal)
Dim i
'...
End Function
它将是不同的变量,没有溢出。
答案 1 :(得分:1)
由于EVIL全局变量i用于顶级循环以及函数shift()和translate_url(),因此得到了你应得的。
证据:只需将循环更改为
即可For Each NoliMeTangere In arr
response.Write translate_url(arr(NoliMeTangere))
next
补救措施:使用“Option Explicit”并将子/函数/方法中的所有局部变量调暗。