Oto dodatkowy pomysł, który może być dość potężny wraz z propozycją Esailiji (patrz uwagi na temat jego odpowiedzi na dyskusję).
Można utworzyć sztuczną ramkę iframe i użyć jej funkcji Function
. Utworzona funkcja będzie miała domyślnie dostęp do zakresu elementu iframe, ale może się z niego wyrwać. Na szczęście łatwo temu zapobiec, tak jak zasugerowała Esailija.
mogłem wyobrazić funkcję być tak:
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
Opcjonalnie można również dodać 'use strict';
do kodu.
Działa to przynajmniej w Chrome. Czy funkcja stworzona w ten sposób ma dostęp do globalnej zakresu iframe lub zasięgu globalnym strony mogą być łatwo testowane:
(function() {
var frame = document.createElement('iframe');
document.body.appendChild(frame);
var same = window === frame.contentWindow.Function('return window;')();
alert(same ? ':(' : ':)');
document.body.removeChild(frame);
}());
Cóż, można zdefiniować 'window' i' document' jako parametry, aby uniemożliwić bezpośredni dostęp do je (jak już powiedziałeś), a następnie dodaj 'use strict ';' do kodu, aby zapobiec niejawnej definicji globali. To może zadziałać. Oczywiście nie uniemożliwia to dostępu do istniejących globali, o ile nie "cienia" ich za pomocą parametrów. Może można iterować po wszystkich właściwościach 'window' i automatycznie utworzyć listę parametrów. –
@FelixKling Brzmi nieźle, mam zamiar spróbować kilku hacków, aby sprawdzić, czy nadal mogę uzyskać dostęp do globalnego numeru – Esailija
@FelixKling tutaj jest mój obecny, może działać, jeśli śledzisz 'Function' http://jsfiddle.net/dFmyd/ – Esailija