pen*_*tur 6 vbscript asp-classic jscript
目前我必须处理用VB编写的遗留系统.我对VB和ASP不太满意,所以我决定用JScript编写这个系统的新代码.
但是,这两种语言之间的互操作性存在一些问题:即,当我试图调用在<script language="vbscript">tag中声明的某个函数时,它会因" Object expected "错误而失败(如果页面语言是VBScript),反之亦然.
即,以下代码:
inc.asp
<script language="vbscript" runat="server">
Sub VBTestFunction(Message)
Response.Write "VBTestFunction: " & Message
End Sub
</script>
<script language="javascript" runat="server">
function JSTestFunction(Message) {
Response.Write("JSTestFunction: " + Message);
}
</script>
Run Code Online (Sandbox Code Playgroud)
testjs.asp
<%@ Language="JavaScript" %>
<!-- #include file="inc.asp"-->
<script language="javascript" runat="server">
VBTestFunction("from javascript");
JSTestFunction("from javascript");
</script>
<script language="vbscript" runat="server">
Call VBTestFunction("from vbscript")
Call JSTestFunction("from vbscript")
</script>
Run Code Online (Sandbox Code Playgroud)
失败,出现以下错误:
VBTestFunction: from vbscript
Microsoft VBScript runtime error '800a000d'
Type mismatch: 'JSTestFunction'
/test.asp, line 9
Run Code Online (Sandbox Code Playgroud)
(如果我对特定行进行评论,其他三个语句将正常工作); 将页面语言设置为VBScript
<%@ Language="VBScript" %>
<!-- #include file="inc.asp"-->
<script language="javascript" runat="server">
VBTestFunction("from javascript");
JSTestFunction("from javascript");
</script>
<script language="vbscript" runat="server">
Call VBTestFunction("from vbscript")
Call JSTestFunction("from vbscript")
</script>
Run Code Online (Sandbox Code Playgroud)
失败,出现以下错误:
Microsoft JScript runtime error '800a138f'
Object expected
/test.asp, line 4
Run Code Online (Sandbox Code Playgroud)
(再次,如果我将注释掉特定的行,其他三个语句将正常工作).
有一篇关于在同一个应用程序中混合使用VB和JS 的MSDN文章,但从文章看来,示例代码应该可以工作,就像TestFunction在另一个文件中声明的那样,毕竟是一个函数.
有没有一些方法,使所有的这件事的工作,并呼吁双方VBTestFunction并JSTestFunction从VB和JS代码?我想应该有一个,否则混合JS和VB就没有意义了.
我一直在监视这个问题,萨尔曼几乎已经回答了这个问题,但有些事情可以澄清.首先,正在引用的文章存在关键问题.它说执行的顺序是这样的: -
1.非默认语言 中元素的
脚本
2.内联脚本3.默认语言中元素的脚本
它错了,或者至少它已经过时了(它确实参考了IIS4)."内联脚本"(即默认语言中的脚本)的处理方式与同一语言的脚本元素的处理方式不同.
以下是如何推断正在发生的事情.
在任何解析开始之前,所有包含点都将被解析,并由包含文件中的内容替换,以创建单个词法"文件".这是在进行任何解析之前创建的.
从每个语言的"文件"中收集脚本代码.您可以想象在找到每个块时会追加多个文件(每种语言一个).请注意,这就是为什么原因<% %>和<script runat="server"默认语言实际上是indistiguishable.
任何静态内容(即runat="server"脚本标记之外的内容或<% %>)都被视为默认语言代码的一部分.将Response.Write创建静态内容字节逐字发送到响应的特殊形式创建并附加到原始文件中找到的默认语言代码.
现在我们有一个或多个脚本可供各自的脚本引擎处理.首先解析并执行非默认语言脚本.创建的任何全局标识符,无论是函数还是变量,都会添加到脚本环境中.但是,由于此时尚未处理默认语言脚本,因此尚未可用于随后添加到全局脚本环境的任何内容.
在解析并执行默认语言脚本时,先前语言脚本创建的所有全局标识符都将添加到脚本环境中,因此可以从内联代码中使用.
您应该注意,默认语言函数可以通过非默认语言的函数中的代码调用,条件是调用非默认函数可以追溯到默认语言的内联执行.
例如,如果默认语言是JScript你可以有一个VBScript函数(fnA)调用在JScript(fnB)中声明的函数,只要调用fnA是作为JScript的内联执行的一部分.IOW JScript可以调用VBScript,而VBScript又可以调用VBScript等,限制因素是这个链中顶部必须是JScript的引擎.
在您的示例代码中,您的VBScript全局(内联)级别的代码试图调用以默认JScript语言声明的函数.如果您按照上面的项目符号进行操作,您将看到在执行该项目时,所调用的函数不存在.