共用方式為


升級由舊版 JScript 建立的應用程式

更新:2007 年 11 月

現有 JScript 程式碼大多都可以配合 JScript 8.0 中的增強功能使用,因為 JScript 8.0 幾乎可以完全回溯相容於舊版。JScript 8.0 的新功能主要涵蓋新的領域。

根據預設,JScript 8.0 程式是在「快速模式」中編譯的。快速模式對程式碼類型有所限制,因此程式執行起來快速又有效率。但是舊版的某些功能,不適用於快速模式。這些功能大多不相容於多執行緒應用程式,因此會影響程式碼的效率。如果是使用命令列編譯器編譯的程式,您可以關閉快速模式,享受完整的回溯相容性。請注意,以這種方式編譯的程式碼,速度較慢,而且容易出錯。在 ASP.NET 應用程式中不可以關閉快速模式,否則會發生不穩定的問題。如需詳細資訊,請參閱 /fast

快速模式

在快速模式中,會觸發下列的 JScript 行為:

  • 必須宣告所有變數。

  • 函式成為常數。

  • 內建物件不能有 expando 屬性 (Property)。

  • 內建物件不能列出或變更屬性。

  • 無法使用 arguments 物件。

  • 無法指派給唯讀變數、欄位或方法。

  • eval 方法無法在封閉範圍中定義識別項。

  • eval 方法在受限的安全性內容中執行指令碼。

必須宣告所有變數

舊版的 JScript 不需要明確宣告變數。雖然這個功能讓程式設計人員省去輸入的麻煩,但卻很難追蹤錯誤。例如,如果您將一個值指派給拼錯的變數名稱,它不會產生錯誤,也不會傳回所需結果。此外,未宣告的變數享有全域範圍,這可能會導致其他混淆的情況。

快速模式需要明確宣告變數。這可以避免前述幾種錯誤,加快程式碼的執行速度。

JScript .NET 也支援加註型別變數。這讓每個變數得以繫結特殊資料型別,而且只儲存該型別的資料。雖然型別附註不是必要項目,但是它能避免在變數中不慎存入錯誤資料時可能產生的錯誤,並可加快程式的執行速度。

如需詳細資訊,請參閱 JScript 變數和常數

函式成為常數

舊版 JScript 將 function 陳述式宣告的函式,視為含有 Function 物件的變數。尤其任何函式識別項都能當做變數來儲存任何的資料型別。

函式在快速模式中會成為常數,因此,您不能為函式重新定義,也不能指派新值,這樣可以防止不慎變更函式的意義。

如果指令碼需要變更函式,您可以明確的使用一個變數來包含 Function 物件的執行個體。但是請注意,Function 物件的速度較慢。如需詳細資訊,請參閱 Function 物件

內建物件不能有 expando 屬性

在舊版 JScript 中,您可以為內建物件加入 expando 屬性。例如,您可以用這種行為替 String 物件加入一個方法來裁掉字串的前置空格。

但是,這在快速模式中是不允許的。如果指令碼依賴這個功能,您就必須修改指令碼。您可以在全域範圍中定義函式,而不必把函式當做方法附加至物件。然後,再為這個從物件呼叫 expando 方法的指令碼,重寫它的每個執行個體,以便將物件傳給適當的函式。

這個規則唯一要注意的例外是 Global 物件,它仍然具有 expando 屬性。全域範圍中的所有識別項實際上是 Global 物件的屬性。很明顯地,Global 物件必須能夠動態延伸,才能支援其他新的全域變數。

內建物件不能列出或變更屬性

在舊版的 JScript 中,您可以刪除、列舉或寫入內建物件預先定義的屬性。例如,這個行為可用來變更 Date 物件預設的 toString 方法。

但是,這在快速模式中是不允許的。因為內建物件不能有 expando 屬性,而參考區段中也會列出每個物件,因此已經不再需要這個功能。如需詳細資訊,請參閱物件

無法使用 arguments 物件

舊版 JScript 在函式定義中提供 arguments 物件,允許函式接受任意數量的引數。這個 arguments 物件也讓您參考目前的函式和呼叫函式。

您無法在快速模式中使用 arguments 物件。但是 JScript 8.0 允許函式宣告在函式參數清單中指定「參數陣列」。這讓函式能夠接受任意數量的引數,因而取代 arguments 物件的部分功能。如需詳細資訊,請參閱 function 陳述式

在快速模式中,沒有任何方法能直接存取及參考目前的函式或呼叫函式。

無法指派給唯讀變數、欄位或方法

在舊版 JScript 中,陳述式似乎可以為唯讀識別項指派一個值。然而指派可能會失敗卻沒有任何跡象,唯一可以查明的方法就是測試這個值是否發生變更。指派到唯讀識別項通常是錯誤所致,因為它沒有任何作用。

如果您嘗試在快速模式中對唯讀識別項指派一值,則會產生編譯時期錯誤。您可以移除這項指派,或是將值指派給非唯讀的識別項。

如果您在快速模式關閉時指派給唯讀識別項,這項指派會在執行階段會失敗而且沒有任何跡象,但是會產生編譯時期警告。

eval 方法無法在封閉範圍中定義識別項

在舊版 JScript 中,您可以在區域或全域範圍中呼叫 eval 方法來定義函式和變數。

在快速模式中,您可以在對 eval 方法的呼叫中定義函式和變數,也可以從這項呼叫中存取它們。eval 一旦完成,就無法再存取 eval 中定義的函式和變數。eval 中的計算結果可以指派給目前範圍中任何可以存取的變數。eval 方法的呼叫速度很慢,您可以考慮重寫包含這些呼叫的程式碼。

快速模式關閉時,eval 方法的前述行為也會跟著還原。

eval 方法在受限的安全性內容中執行指令碼

在舊版的 JScript 中,傳遞至 eval 方法的程式碼會在與呼叫程式碼相同的安全性內容中執行。

為了保護使用者,傳遞至 eval 方法的程式碼會在受限的安全性內容中執行,除非第二個傳遞的參數是 "unsafe" 字串。受限的安全性內容可以防止存取任何系統資源,例如檔案系統、網路或使用者介面。如果程式碼嘗試存取這些資源,便會產生安全性例外狀況。

如果 eval 的第二個參數是 "unsafe" 字串,則傳遞至 eval 方法的程式碼會在與呼叫程式碼相同的安全性內容中執行。如此 eval 方法的行為便會還原成與先前一樣。

安全性注意事項:

只有在執行從已知來源取得的程式碼字串時,才能在不安全模式中使用 eval

請參閱

概念

適合 JScript 程式設計人員的 JScript 8.0 簡介

參考

/fast

其他資源

JScript 使用者入門