Как закрыть доступ к глобальному объекту window?
Есть скрипт. Возможно ли каким-нибудь способом сделать так, чтобы из этого скрипта не было доступа к объекту window?
|
Нет.
|
Цитата:
|
А так нельзя ?
(function(window) { window = {}; window.a = 'aaaa'; //Это тот скрипт который не должен иметь доступа к window })(window); alert(window.a); |
Цитата:
сайт site.ru <script> window.a = 'hello'; </script> <iframe src="anothersite.ru"></iframe> сайт anothersite.ru <script> alert( window.a ); // undefined <script> Цитата:
|
Цитата:
Цитата:
|
walik,
(function(window) { window = {}; (function(){return this})().a = "mhahahaha, I'm badboy!"; b = 'Much easier way'; window.a = 'aaaa'; //Это тот скрипт который не должен иметь доступа к window })(window); alert([window.a, window.b]); |
Обидно :) :) :)
|
function create_isolated_closure(func) { var global = (function(){return this;}).call(null); var undefined; // перекрываем абсолютно все что есть в global var scope = {}; for(attr in global) { scope[attr] = undefined; } delete scope.alert; // оставляем доступ к alert(), чтобы тестировать функции with(scope) return eval("(function () { return ("+func.toString()+"); })()"); } function test() { alert(document); alert(window); } test(); // обычный вызов, DOM доступен var t = create_isolated_closure(test); // делаем изолированную копию функции t.call({}); // вызов изолированной копии, DOM недоступен |
По-прежнему
function create_isolated_closure(func) { var global = (function(){return this;}).call(null); var undefined; // перекрываем абсолютно все что есть в global var scope = {}; for(attr in global) { scope[attr] = undefined; } delete scope.alert; // оставляем доступ к alert(), чтобы тестировать функции with(scope) return eval("(function () {return ("+func.toString()+"); })()"); } function test() { var w = (function(){return this})(); w.alert(['hacked', w.document]); } var t = create_isolated_closure(test); // делаем изолированную копию функции t.call({}); // вызов изолированной копии, DOM недоступен |
Да ... как раз сейчас и думаю, что с этим можно сделать.
|
В strict mode this должен по-умолчанию быть равен undefined. Только with там запрещён
"use strict"; alert( (function(){return this})() )В хромиуме (и, вроде как, FF5) оно уже работает, но в Опере ещё нет. А ещё есть такая хитрость: function create_isolated_closure(func) { var global = (function(){return this;}).call(null); var undefined; // перекрываем абсолютно все что есть в global var scope = {}; for(attr in global) { scope[attr] = undefined; } delete scope.alert; // оставляем доступ к alert(), чтобы тестировать функции with(scope) return eval("(function () { 'use strict'; return ("+func.toString()+"); })()"); } function test() { var w1 = (eval || eval)("this"), w2 = (function(){return this})(); alert([w1, w2]); } var t = create_isolated_closure(test); // делаем изолированную копию функции t.call({}); // вызов изолированной копии, DOM недоступен |
Да, strict mode интересная штуковина, не знал. Спасибо.
По примеру, в хроме помогает и this undefined, а вот в ff 3.6 всё отлично. |
Часовой пояс GMT +3, время: 13:21. |