Pull to refresh

Comments 13

Спасибо, о таких приколах лучше знать наперед.
да, иначе они забирают по несколько часов поиска проблемы :)
хым, а если замыкание?.. Julien Lecompte неглупый-то чувак…
не уловил мысль, по детальнее можно?
B.test() — классическое замыкание. Теоретически, переменная A может быть переопределена где-то до вызова этого метода, в итоге, мы получим не то, что нужно. Причем это может произойти как раз из-за обфускации (неверный расчет области видимости из-за замыкания). Т.е. на входе были разные переменные, на выходе — одна, области использования которой (из-за замыкания опять-таки) могут пересекаться.

В итоге мы получаем нестабильный, в общем случае, код. Об этом то ли John Resig, то ли Dean Edwards, то ли сам Julien писали в свое время. Т.е. здесь лучше как-то самого замыкание избежать с window.eval, а не пытаться обойти логику обфускатора.
1) дело в том что я сам не сторонник eval, но есть случае когда альтернативы ему просто нету. простой кода всегда лучше сложного, но сами знаете иногда какие бывают случаи…
2) было классно привести пример выше описанного вами случая: когда переменная А может быть переопределена до этого вызова… мы тогда точно разберемся как правильно
дело за абстрактным примером не постоит :)
(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()
  }
 };
//very-very dirty assignment
 window.onclick=E.modify();
 B.test();
//here click occurs
 B.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();

})()


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

разница есть, потому что исходный код приведен неверно :)
var E={
 modify:function(){
  var LOCALLONGNAME=«e»;
  var C=(function(){
  _NEW_TOPLONGNAME='x';
  });
  C()
 }
};
идем дальше :), имеем

(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()})();


как видим все ок.
вообщем я делаю вывод что запутывание компрессора гипотетически возможно, но очень маловероятно, я уже перепробовал много разных вариантов и во всех случаях которые я смог смоделировать компрессор справился без ошибок
я думаю, были какие-то реальные случае, когда компрессор глючил на этом месте, поэтому Lecompte и сделал этот хак
походу нашел вот такое описание 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']… возможно стоит все же подумать перед переименованием, а после тщательно перепроверять результат сжатия на полную работоспособность…

Sign up to leave a comment.

Articles