2010-10-07 80 views
0

我有以下代碼:JavaScript編譯器在.net給人錯誤

Dim compiler As ICodeCompiler = New Microsoft.JScript.JScriptCodeProvider().CreateCompiler 
     Dim params As New CompilerParameters 
     params.GenerateInMemory = True 

     Dim res As CompilerResults = compiler.CompileAssemblyFromSource(params, TextBox1.Text.Trim) 
     Dim ass As Assembly = res.CompiledAssembly 
     Dim instance As Object = Activator.CreateInstance(ass.GetType("Foo")) 

     Dim thisMethod As MethodInfo = instance.GetType().GetMethod("FindProxyForURL") 
     Dim str(1) As String 
     str(0) = "" 
     str(1) = "" 

MessageBox.Show(thisMethod.Invoke(instance, str)) 

試圖編譯如下因素的JavaScript代碼:

類Foo {

function FindProxyForURL(url, host) 
     { 
      alert('Test') 
      return "PROXY myproxy.local:8080"; 
     } 
} 

和獲取上的錯誤 -

compiler.CompileAssemblyFromSource(params, TextBox1.Text.Trim) 

{C:\用戶\我\應用程序數據\本地\ TEMP \ zfwspah4.0.js(4,65) :錯誤JS1135:變量 '警報' 已經 尚未聲明}

如果刪除「警報」線它工作正常。 我收集這是因爲警報是一個「窗口」對象,所以.Net無法識別它。我試圖用window.alert('') 替換它,但仍然得到相同的錯誤。

我該如何解決這個問題?

+0

你如何建議執行你編譯的JavaScript?我不認爲有一種方法可以在網頁中執行此操作,因此訪問窗口對象(警報或其他)是多餘的。 – Lazarus 2010-10-07 15:11:30

+0

您需要將Alert函數的實現添加到編譯後的程序集中。 – unclepaul84 2010-10-07 15:13:52

+0

「alert()」行不以「;」結尾。我認爲這會導致編譯失敗,但它可能只是您發佈中的複製粘貼錯誤,而不是根本原因。 – mikemanne 2010-10-07 16:55:10

回答

1

alert是由某些主機環境提供的函數(例如,瀏覽器擁有它,但服務器可能不)。從alert更改爲window.alert並沒有什麼區別,因爲(在瀏覽器上)它是相同的。 window是引用回全局對象的全局對象的屬性,alert是引用主機提供的函數的全局對象的屬性,所以window.alertalert相同,與window.window.window.alert相同。離題...)

無論您要運行編譯的JavaScript的主機環境提供什麼機制,您都必須使用(並可能導入或接收爲函數參數等) 。

0

爲了詳細說明所說的內容。

window對象是網絡瀏覽器的域對象模型的一部分,嚴格來說,它不是一個JavaScript對象,而只是一個瀏覽器對象的JavaScript接口,如果您願意,也可以是代理。因此,DOM參考類型給出了這一點,它是特定於執行領域的,即它只對Web瀏覽器內的JavaScript解釋器可用,而不是向其提供DOM。由於alert是一個window對象的方法,所以您比較沒有使用DOM。

正如TJ提到的,如果你想要一個彈出式警報窗口可用於你編譯的JavaScript應用程序,那麼你將不得不爲自己實現它,我會說實話,我不知道從哪裏開始。這超出了這個問題的範圍。