感謝所有的想法,我最終只是在構建腳本中做文本替換,輸出JS,基本上用eval代替$ EVAL $,所有東西都被壓縮後。我希望純粹的JS方式,但有這麼多不同的eval瀏覽器實現,它可能會更好地離開eval獨自
但基於Dimitar的答案和一些擺弄,這是我發現。 好像之所以這樣[「的eval」]沒有工作是因爲,它的發生,在MooTools的JSON.decode的地方,也是一個內部的哈希:
var JSON = new Hash({
// snip snip
decode: function(string, secure){
if ($type(string) != 'string' || !string.length) return null;
if (secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) return null;
return this.eval('(' + string + ')'); // Firefox says: TypeError: this.eval is not a function
}
});
但是,如果我存儲「頂級」本地範圍(所有的代碼,包括mootools的,匿名函數中運行),那麼它的工作原理:
var TOP = this;
var JSON = new Hash({
// snip snip
decode: function(string, secure){
if ($type(string) != 'string' || !string.length) return null;
if (secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) return null;
return TOP.eval('(' + string + ')'); // All good, things run within the desired scope.
}
});
然而,這並不在Safari工作,所以底線是,我試圖做不能做到交叉兼容。 eval是一種特殊的敏感功能,每個瀏覽器都以不同的方式對待它。
因爲'eval'不被認爲是一種普通的功能,你可能會勝過YUI壓縮器,但是你會遇到瀏覽器,它們不會或很快不會讓你用任何其他名稱調用'eval'。 – 2010-02-03 23:29:35