JavaScript模块的沙箱化

3

是否可以将JavaScript模块隔离,以避免对DOM的操作?例如:

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 */
    }
});
1个回答

0

有点吧:你可以将函数放入沙盒中,但它的被调用者也会被放入沙盒。这意味着即使在 Core.publicApi 中的内容也无法访问 document 等内容。或者说,在Javascript中没有完全可靠的沙盒技术可以实现这种桥接。

您可以通过暂时覆盖 window 变量来限制可用性:

var window = {"Core": Core};

但是,这样做将不会为被调用者创建任何全局变量(即使是像alert这样的变量)。这很可能会破坏您的API。

您可以向新的window变量添加另一个成员(例如_unsandboxed或其他名称),以允许您的API访问这些成员。但是,正如我所说,这并不是百分之百可靠的,因为沙盒函数仍然可以访问_unsandboxed


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接