我正在尝试在JavaScript中的空隔离执行上下文中执行一段代码。在下面的示例中,我正在尝试隔离isolated
执行范围。我想要做的是在没有全局变量的上下文中执行函数。
(function() {
'use strict';
var scope = Object.create(null);
var isolated = function() {
'use strict';
console.log(document); // Trying to get undefined
// but traces `document`.
};
isolated.call(scope);
})();
我认为取消全局变量很简单但有太多了!
var isolated = function(window, document, location /* etc */) {
// ...
};
isolated.call(scope, undefined, undefined, undefined /* etc */);
有更好的方法吗?
答案 0 :(得分:4)
在javascript本身中没有良好的方法(但请参阅Gareth Hayes的另一个选项)。
有几种不好的方法。
(function() {
var scope = Object.create(null);
var obscurer = {};
for (var key in this) {
obscurer[key] = undefined;
}
with (obscurer) {
var isolated = function() {
'use strict';
console.log(document);
};
}
isolated.call(scope);
})();
请注意,您实际上会收到错误,因为未定义控制台而不是文档,尽管您可以通过不阻止obscurer对象中的“console”来解决此问题。你可能会发现你需要比你意识到的更多的全局变量。
您也只是阻止了窗口的可枚举属性。如果您发现了想要阻止的不可数属性,则必须将它们添加到obscurer。
当然,使用with
意味着您不能再使用严格模式了,每个人都会低头看着你......
如果您在节点而不是浏览器中工作,可以使用更多有趣的选项。
答案 1 :(得分:2)
使用我的MentalJS解析器隔离环境。然后,您可以通过自定义代码来选择它有权访问的对象/变量。
http://businessinfo.co.uk/labs/MentalJS/MentalJS.html
http://code.google.com/p/mentaljs/
默认情况下,它允许访问文档,但您可以阻止此操作,在此处自定义环境http://code.google.com/p/mentaljs/source/browse/trunk/MentalJS/javascript/Mental.js#260,然后您可以选择是否可以访问Math等。
答案 2 :(得分:0)
可以在没有ECMA6的情况下使用包含您的受信任需求保护代码的IIFE来完成,您可以在其中注入不受信任的需求隔离代码(参见示例)。
(function(injectedFunction) {
/* Trusted code, that needs protection from untrusted code access */
var hostingFuncPrivatePrimitive = "Hello there";
var hostingFuncPrivateObject = {
this_is_mine: true
};
var sharedPrimitive = 'This is shared';
var sharedObject = {};
// Running the untrusted code:
injectedFunction(sharedPrimitive, sharedObject);
console.log("sharedObject is: " + JSON.stringify(sharedObject));
console.log("hostingFuncPrivateObject is: " +
JSON.stringify(hostingFuncPrivateObject));
})(
(function(primitiveArg, objArg) {
/* Untrusted code that needs isolation */
// 1. using primitive (legal)
console.log('primitiveArg is: ' + primitiveArg);
// 2. Writing value to given objArg (legal):
objArg.mumu = 'mimi';
// 3. Trying to access host function variables (illegal)
try {
console.log('hostingFuncPrivatePrimitive is:' +
hostingFuncPrivatePrimitive);
hostingFuncPrivateObject.this_is_mine = false;
} catch (e) {
console.log(e);
}
})
);
如果您将上述内容放在Chrome的控制台中,您将获得:
primitiveArg is: This is shared
VM117:29 ReferenceError: hostingFuncPrivatePrimitive is not defined
at <anonymous>:26:17
at <anonymous>:11:5
at <anonymous>:16:3
VM117:12 sharedObject is: {"mumu":"mimi"}
VM117:13 hostingFuncPrivateObject is: {"this_is_mine":true}
P.S。:我知道我迟到了,但也许这对任何人都有帮助。