ASP具备管理不同语言脚本程序的能力能够自动调用合适的脚本引擎以解释脚本代码和执行内置函数ASP开发环境提供了两种脚本引擎即VBScript(缺省)和JScript不过开发者并没有被限制于只能使用这两种语言只要能够提供合适的ActiveX脚本引擎就能使用任何脚本语言
脚本语言的选择往往基于许多不同原因它可能是开发者最为熟悉的语言可能是对给定工程来说能够提供最多特色支持的也有可能是最具效率的不同的环境和要求使得我们在选择脚本语言时注重不同的因素同时也使得我们在某些时候面临选定的脚本语言不能直接提供其它语言固有的函数这一问题或某个脚本已经写成但用的却是另外一种脚本语言
此时应该怎么办?是否需要用当前所用的脚本语言重写这些脚本?或者说是否有可能在一种脚本语言中调用其它脚本语言的内置函数?本文要说明的就是在ASP应用中如何让VBScript脚本和JScript脚本交互以最大限度地获得两种脚本语言的特色支持
一VBScript和JScript的内置函数
在VBScript和JScript中有大量的内置函数功能是相同或类似的然而在一种脚本语言中内置的函数并非总是在另外一种脚本语言中也有对应的函数例如VBScript提供了许多用于操作字符串和格式化数据的函数这些函数在JScript中并不存在这些函数包括StrReverse()Filter()以及FormatCurrency()等在另一方面JScript所提供的用于管理数组字符串编码等的函数在VBScript中也没有定义如join()reverse()pow()位操作escape()和unescape()等
那么如果在JScript程序中需要一个VBscript函数该怎么办呢?
二异种脚本的互相调用
如果需要在JScript脚本中调用一个VBScript中内置的函数则应该写一个VBScript用户定义函数(在这里调用VBScript内置函数)然后在JScript脚本中象调用公用JScript函数一样调用这个用户定义函数
例如如果要调用的VBSCript内置函数是FormatCurrency()则可以声明如下自定义函数
< SCRIPT LANGUAGE=VBSCRIPT RUNAT=SERVER>
Function FormatValue(Value)
FormatValue = FormatCurrency(Value)
End Function
< /SCRIPT>
接下来在JScript代码中就可以象普通JScript函数一样调用FormatValue()了用类似的方法也可以实现VBScript代码调用JScript函数
应用同样的规则我们可以在任何脚本内调用任何用户定义函数不过从JScript脚本内调用一个不带参数的VBScript过程(Sub)时应略加注意此时在JScript中应该象调用一个不带参数的JScript函数一样调用它如用foo()调用VBScript Sub foo过程
三数据共享
在某些情形下混合运用VBScript和JScript函数是非常有用的但在不同语言脚本之间共享数据也可能很有用实现这种共享的方法很简单不管使用的是什么语言只要是在页面级声明的变量就可以任意引用
对象的使用方法也相似可以任意选用合适的语言读取修改属性或调用对象的方法当然给定对象的属性和方法是由创建该对象实例的语言所定义的正如上例VBScript的过程调用
当从JScript中调用一个不带参数的VBScript对象的方法时其调用方法也遵从JScript的调用规则反之亦然
四数组管理
数组共享问题稍微复杂一点虽然数组也象其它变量一样可以在不同语言脚本之间共享但必须注意兼容方面的问题
VBScript数组在JScript下可以用VBScript的符号引用即用myArray()引用数组元素而不是JScript的数组元素引用符号myArray[]此外还可以使用一个特殊的JScript对象——VBArray对象将VBScript数组转换为JScript数组下面的代码从VBScript数组myVBArray创建JScript数组myJSArray
var Temp = new VBArray(myVBArray)
var myJSArray
myJSArray = TemptoArray()
上述代码首先创建一个临时的VBArray对象然后使用它的toArray()方法将自己转换为JScript数组此后就可以象普通JScript数组一样使用myJSArray如myJSArray[]但应当注意的是toArray()方法将把一个多维的VBArray转换为一维的JScript数组
从VBScript中引用JScript数组更为复杂虽然在VBScript中我们可以直接访问JScript数组相关的方法和属性但没有直接访问JScript数组的单个元素的方法也就是说我们可以在VBScript脚本中读取JScript数组的长度属性如下所示
x = myJSArraylength
但无法直接读取该数组的单个元素下面的VBScript代码是不正确的
x = myJSArray()
解决该问题的一个可行的方法是执行一个转换过程如下面的代码所示此处假定VBScript是缺省的脚本语言
< %
Dim Temp
Dim myVBArray
Temp = myJSArrayjoin( )
myVBArray = Split(Temp )
%>
此处的JScript join()方法将数组myJSArray元素转换到一个以逗号为分割符的字符串VBScript Split()函数将字符串转换为VBScript数组注意这里我们是在VBScript环境下调用JScript的join方法依照此例我们可以通过自定义VBScript函数来模拟JScript的VBArray对象的toArray()方法以实现JScript数组到VBScript数组的转换
五小结
在同一个ASP工程内灵活选用不同脚本语言具有许多优点这些脚本之间的交互能力更为开发者集成不同语言所提供的内置函数和其它功能带来了更多的机会同时也使得实现既可用于VBScript也可用于JScript环境的通用脚本库成为可能