在傳統 ASP (Classic ASP) 使用 JScript 5.6 時,eval("var a=1;") 可在當前作用域建立變數。升級至 ASP.NET (JScript 8.0 / JScript.NET) 後,同樣代碼報錯 「第三行出現語法錯誤」。根因在於 Fast Mode (快速模式) 的限制。
eval 無法在封閉作用域內定義新識別符 (變數/函數)eval 內定義的識別符,僅在該次 eval 執行期間可見,結束即銷毀arguments 物件<%@ LANGUAGE='JScript' DEBUG="true" %>
<script language="javascript" runat="server">
eval("var f1=1,f2=2,f3=3;");
Response.Write(f1 + "<br/>"); // 編譯錯誤:f1 未定義
</script>
利用全域物件 (Global Object) 可動態擴充屬性的特性,將「變數」轉為「物件屬性」:
<%@ LANGUAGE='JScript' DEBUG="true" %>
<%
var TAB = {}; // 全域物件,可動態增屬
var n = 12;
for (var i = 0; i < n; i++) {
var fld = "F0" + (i < 10 ? "00" : (i < 100 ? "0" : "")) + i;
TAB[fld] = i + 1000; // 動態寫入屬性
}
for (var i = 0; i < n; i++) {
var fld = "F0" + (i < 10 ? "00" : (i < 100 ? "0" : "")) + i;
Response.Write(TAB[fld] + "<br/>");
}
%>
var container = {};
eval("container.f1=1; container.f2=2;", "unsafe"); // 第二參數 "unsafe" 解除沙箱 (慎用)
Response.Write(container.f1);
注意:"unsafe" 會讓 eval 在調用者安全上下文執行,僅用於受信代碼字串。
ASP.NET 應用程式無法關閉 Fast Mode (會導致穩定性問題)。命令列編譯 jsc.exe /fast- 可關閉,但不適用於 Web 環境。
var dict = new Dictionary<string, object>(); dict["f1"] = 1;eval 風險。"use strict";,禁止 eval 污染作用域。升級先前的 JScript 版本中創建的應用程式 (MSDN) - 詳細列出 Fast Mode 所有行為差異。