3

是否可以从 DOM 操作中对 javascript 模块进行沙箱处理?例子

var Core = { 
    register: function(config){config.init()},
    publicApi: {
        msgbox: function(msg){alert(msg)} 
    } 
}
Core.register({
    name: 'testmodule',
    init: function(){
        /* from there i want to see only function defined in Core.publicApi, no jQuery direct access, no DOM */
    }
});
4

2 回答 2

3

我建议在 Slideshare 阅读有关应用程序沙盒模块模式的幻灯片,名为在 Gilt 构建 JavaScript 模块框架

于 2011-07-02T02:11:07.690 回答
0

好吧,在某种程度上:您可以对函数进行沙箱化,但它的被调用者也将被沙箱化。这意味着即使里面的东西Core.publicApi也无法访问document等等。或者,至少,Javascript 中没有防弹沙箱可以允许这种桥接。

您可以通过临时覆盖window变量来削弱可用的内容:

var window = {"Core": Core};

但是,被调用者将存在全局变量(即使是alert)。这很可能会破坏您的 API。

您可以将另一个成员(例如_unsandboxed或其他)添加到新window变量中,以允许您的 API 访问这些成员。但是,正如我所说,它不是万无一失的,因为沙盒功能仍然可以访问_unsandboxed.

于 2010-03-06T15:05:52.540 回答