1

在经典的 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”。

我需要做什么才能让代码顺着数组顺流而下,并根据函数返回对应的值?

4

2 回答 2

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

它将是不同的变量并且不会溢出。

于 2013-06-12T10:45:09.507 回答
1

由于 EVIL 全局变量 i 用于您的顶级循环以及函数 shift() 和 translate_url(),因此您得到了应得的结果。

证据:只需将循环更改为

For Each NoliMeTangere In arr
  response.Write translate_url(arr(NoliMeTangere))
next

补救措施:使用“Option Explicit”并在您的 Subs/Functions/Methods 中调暗所有局部变量。

于 2013-06-12T11:15:13.440 回答