Aquí hay una idea adicional que podría ser bastante poderosa junto con la propuesta de Esailija (ver los comentarios sobre su respuesta para la discusión).
Puede crear un iframe ficticio y usar su función Function
. La función creada con eso solo tendrá acceso al alcance del iframe de manera predeterminada, aunque aún podría salir de él. Afortunadamente es fácil evitar eso, por cierto sugirió Esailija.
me podía imaginar la función que ser así:
function sandboxed(code) {
var frame = document.createElement('iframe');
document.body.appendChild(frame);
var F = frame.contentWindow.Function,
args = Object.keys(frame.contentWindow).join();
document.body.removeChild(frame);
return F(args, code)();
}
DEMO
Opcionalmente es posible que desee anteponer 'use strict';
al código.
Esto funciona, al menos en Chrome. Si la función creada de esta manera tiene acceso al ámbito global del marco flotante o el alcance global de la página se puede probar fácilmente con:
(function() {
var frame = document.createElement('iframe');
document.body.appendChild(frame);
var same = window === frame.contentWindow.Function('return window;')();
alert(same ? ':(' : ':)');
document.body.removeChild(frame);
}());
Bueno, se podría definir 'window' y' document' como parámetros, para evitar el acceso directo a ellos (como ya dijiste) y luego anteponer ''use strict';' al código para evitar la definición implícita de globales. Aquello podría funcionar. Pero, por supuesto, no impide el acceso a los globales existentes, siempre y cuando no los "oculte" mediante parámetros. Quizás uno podría iterar sobre todas las propiedades de 'ventana' y crear la lista de parámetros automáticamente. –
@FelixKling Suena bien al valor nominal, voy a probar algunos hacks para ver si aún puedo obtener acceso a global – Esailija
@FelixKling aquí está mi actual, podría funcionar si sombreas 'Function' http://jsfiddle.net/dFmyd/ – Esailija