2013-05-29 64 views

回答

1

原則,這種做法也許應該工作。然而,幾件事情需要注意:

  1. 顯然,這需要把所有不可信代碼到使用範圍的。在實踐中,這可能會變得相當笨拙。

  2. 此外,它巧妙地改變了代碼中包含的最外層的var/function聲明的含義,現在它變成了局部而不是全局對象的屬性。另一方面,未聲明的變量仍將以全球目標而告終。這可能會破壞一些程序。

  3. 由於'with'的瘋狂語義,現代JavaScript虛擬機放棄了大多數優化其範圍代碼的嘗試。生成的代碼很容易比具有'with'的東西慢兩個數量級。

總的來說,我不會推薦這種方法。你用SES或Caja(不確定你在哪種意義上稱之爲服務器端)更好。

(另外值得一提的是,ES6的模塊裝載機將提供沙箱中全局對象更清潔的方式,但它是很難說當這些將成爲適用不很快。)

+0

- 我稱之爲卡哈「服務器 - 方「,因爲它需要一個外部java服務器/進程來哄騙代碼。另外,你無法用Caja做任何你想做的事情(某些庫不起作用,像Audio API這樣的對象不會被馴服等) - 我已經讀過(簡單地說,我承認)[Harmony模塊規範]( http://wiki.ecmascript.org/doku.php?id=harmony:module_loaders)。你如何沙箱的全球對象? (defineBuiltins,我猜,但不清楚)。 - 什麼是SES? :) – janesconference