<< 2025 年 5 月 >>
    123
45678910
11121314151617
18192021222324
25262728293031
回首頁 | 到今日 | 到本月

文章分類

最新文章

vbscript和javascript互相呼叫方法                          

2021/1/5 下午 09:26:39發表      點閱: 2343    推荐 :394                          


 

內容面板收納

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(2)引用陣列元素而不是JScript的陣列元素引用符號myArray[2]。此外,還可以使用一個特殊的JScript物件——VBArray物件將VBScript陣列轉換為JScript陣列。下面的程式碼從VBScript陣列myVBArray建立JScript陣列myJSArray:

var Temp = new VBArray(myVBArray)
var myJSArray
myJSArray = Temp.toArray()

上述程式碼首先建立一個臨時的VBArray物件,然後使用它的toArray()方法將自己轉換為JScript陣列。此後就可以象普通JScript陣列一樣使用myJSArray,如myJSArray[1]。但應當注意的是,toArray()方法將把一個多維的VBArray轉換為一維的JScript陣列。

從VBScript中引用JScript陣列更為複雜。雖然在VBScript中我們可以直接訪問JScript陣列相關的方法和屬性,但沒有直接訪問JScript陣列的單個元素的方法。也就是說,我們可以在VBScript指令碼中讀取JScript陣列的長度屬性,如下所示:

x = myJSArray.length

但無法直接讀取該陣列的單個元素,下面的VBScript程式碼是不正確的:

x = myJSArray(3)

解決該問題的一個可行的方法是執行一個轉換過程,如下面的程式碼所示,此處假定VBScript是預設的指令碼語言:

<%
Dim Temp
Dim myVBArray
Temp = myJSArray.join(", ")
myVBArray = Split(Temp, ", ")
%>

此處的JScript join()方法將陣列myJSArray元素轉換到一個以逗號為分割符的字串,VBScript Split()函式將字串轉換為VBScript陣列。注意這裡我們是在VBScript環境下呼叫JScript的join方法。依照此例,我們可以通過自定義VBScript函式來模擬JScript的VBArray物件的toArray()方法以實現JScript陣列到VBScript陣列的轉換。

五、小結

在同一個ASP工程內靈活選用不同指令碼語言具有許多優點,這些指令碼之間的互動能力更為開發者整合不同語言所提供的內建函式和其它功能帶來了更多的機會,同時也使得實現既可用於VBScript也可用於JScript環境的通用指令碼庫成為可能
  推荐分享 推薦本文到Twitter推特去! 推薦本文到Plurk噗浪去! 推荐本文到 facebook臉書   
 

我要評論

標題
暱稱
郵件
內容
* 驗證碼