All streams
Search
Write a publication
Pull to refresh
28
0
sirus @sirus

User

Send message
а как выгружается весь модуль?
а зачем все сложно так, обычно я делаю так: каждый модуль имеет деструктор, который и заботится про очистку. Вызываем при выгрузке модуля его деструктор и все. у тебя похоже тоже самое, но както слишком уж «замучено», или я не понял в чем фишка?
вообщем я делаю вывод что запутывание компрессора гипотетически возможно, но очень маловероятно, я уже перепробовал много разных вариантов и во всех случаях которые я смог смоделировать компрессор справился без ошибок
идем дальше :), имеем

(function(){
  var TOPLONGNAME = 'a';
  var obj = {
   test: function(){ 
     var LOCALLONGNAME = 'b';
     var res = window['eval'](function(){
       alert(TOPLONGNAME + LOCALLONGNAME);   
     });
     res();
   }
  }

var E={
 modify:function(){
  var LOCALLONGNAME=«e»;
  var C=(function(){
  _NEW_TOPLONGNAME='x';
  });
  C()
 }
};
  obj.test();
//very-very dirty assignment
window.onclick=E.modify();
//here click occurs
  obj.test();

})()


после сжатия

(function(){var A=«a»;var C={test:function(){var E=«b»;var D=window[«eval»](function(){alert(A+E)}); D()}};var B={modify:function(){var D=«e»;var E=(function(){_NEW_TOPLONGNAME=«x»}); E()}}; C.test(); window.onclick=B.modify(); C.test()})();


как видим все ок.
нету никакой разницы между вашим смоделированным вариантом

(function(){
var A=«a»;
var B={
 test:function(){
  var D=«b»;
  var C=window[«eval»](function(){
  alert(A+D)
  });
  C()
 }
};
var E={
 modify:function(){
  var D=«e»;
  var C=(function(){
  A='x';
  });
  C()
 }
};
B.test();
//very-very dirty assignment
window.onclick=E.modify();
//here click occurs
B.test();
})();


и между чистым кодом

(function(){
  var TOPLONGNAME = 'a';
  var obj = {
   test: function(){ 
     var LOCALLONGNAME = 'b';
     var res = window.eval(function(){
       alert(TOPLONGNAME + LOCALLONGNAME);   
     });
     res();
   }
  }

var E={
 modify:function(){
  var LOCALLONGNAME=«e»;
  var C=(function(){
  TOPLONGNAME='x';
  });
  C()
 }
};
  obj.test();
//very-very dirty assignment
window.onclick=E.modify();
//here click occurs
  obj.test();

})()


нужен конкретный проблемный пример, я думаю многим будет интересно разобраться до конца

походу нашел вот такое описание YUI

...(in the face of evil features such as eval or with, the YUI Compressor takes a defensive approach by not obfuscating any of the scopes containing the evil statement)…

т.е. компрессор намеренно не сжимает код при eval or with…

без примера туговато, щас поищу пример чтобы понятно стало

… ну, конкретно в моем случае все работает замечательно при сжатии с window['eval']… возможно стоит все же подумать перед переименованием, а после тщательно перепроверять результат сжатия на полную работоспособность…

1) дело в том что я сам не сторонник eval, но есть случае когда альтернативы ему просто нету. простой кода всегда лучше сложного, но сами знаете иногда какие бывают случаи…
2) было классно привести пример выше описанного вами случая: когда переменная А может быть переопределена до этого вызова… мы тогда точно разберемся как правильно
не уловил мысль, по детальнее можно?
да, иначе они забирают по несколько часов поиска проблемы :)
хороший пример, для меня был полезен момент с отображенем иконки загружаемого файла.
в вашем методе есть недостаток - если увеличить или уменьшить размеры шрифта, пропорция кнопки инпута картинке-эмулятору будет нарушена, что вызывает "несоответсвующую кликабельность". я использую немного другой алгоритм: динамически перемещаю с помощью жабаскрипта файл-инпут под мишку пользователя в пределах картинки-эмулятора. Это позволяет использовать картинки-эмулятора любого размера и не зависит от шрифта пользователя.
немного непонятно: что значит Back и Forward будут работать и в то же время в history это никак не отразится?
нефиг лазит по гадким сайтам, никакой патч не спасет от всех сайтов, которые хотят навредить юзеру.
другое дело, если "левый код" подгружается в доверительном сайте, тогда то что используется callee, при грамотной реализации никак не помешает

_eval = eval;
eval = function(str){
if (confirm("Выполнить?\n" + str)) _eval(str)
}
в url некрасиво добавлять, хотя подход с url использовался раньше чаще, на данный момент круче все же через header, чище получается, если можно так выразится - то более REST правильно
я думаю не стоит лезть внутрь prototype, потому как после обновления версии все ваши изменения будут потеряны...
а каждый раз и ненадо добавлять хеадер, надо использовать тогда когда надо :), если надо всегда используйте либо 'post', либо глобализируйте опции
Можно с GET и без возьни, достаточно добавить нужный хеадер

new Ajax.PeriodicalUpdater('items', '/items', {
method: 'get',
frequency: 3,
decay: 2,
requestHeaders : {
'If-Modified-Since' : 'Sat, 1 Jan 2000 00:00:00 GMT'
}
})
ну в кривом коде всегда можно найти дыру, а в качественном и eval можно контролировать, хотя займет дополнительных телодвижений.
сильный комментарий, сразу видно "блеск" интеллекта!
проблемы всегда есть, если не eval, то найдется чтото другое. кухонный нож в руках повара инструмент для изготовления искусных блюд, а в руках маньяка - холодное оружие...
хм, я не заметил его. спасибо, надо будет разобраться
а от этого поменяется смысл? наверно потому что короче, оптимизация уже в подсознании

Information

Rating
Does not participate
Location
Украина
Date of birth
Registered
Activity