经典的 ASP 变量作用域——我想我已经失去了理智

1 scope asp-classic iis-7.5

自从我使用经典的 asp 已经有一段时间了,关于变量范围,我已经完全失去了大脑。

我在这里做错了什么?

<SCRIPT LANGUAGE=vbscript RUNAT=Server>
dim test
test = "Test it"

function testAsp()
   testasp = "Should be a result here " & test
end function
</SCRIPT>

<html>
<body>
<%
   response.write(testAsp())
%>
</body>
</html> 
Run Code Online (Sandbox Code Playgroud)

如果我在块内移动声明,一切都很好。运行服务器 2008 R2,IIS 7.5。有什么改变吗?或者是我吗?

Chr*_*sen 5

将您的更改<SCRIPT LANGUAGE=vbscript RUNAT=Server>为 a<%并将您的更改</SCRIPT>为 a %>,您应该会很好。

您会被经典 ASP 生命周期中脚本引擎的执行顺序所吸引。这很令人困惑,但是该<SCRIPT />块将在该<% %>块之后执行,即使它按照源的顺序排在最前面。我无法轻易解释为什么在<% %>块中定义函数,但我认为它与函数提升有关。

为了进一步澄清,这是您开箱即用的顺序(假设 VBScript 被配置为您的默认语言):

  1. JScript 包含在 <script runat="server" language="jscript" />
  2. 内联 VBscript,包含在<% %>块中
  3. VBScript 包含在 <script runat="server" language="vbscript" />