во-первых, можете меня поздравить! моя снова сменяла места работы. теперь это компания со 100 тыс. сотрудников и полста миллирадами баксов ревеню. но это мелочи. а вот самое интересное. есть индусский код вида:
this.document.foo = function (val)
{
if (typeof val == 'string')
if (this.document != null)
return this.document.bar(val);
return "факир был пьян";
} |
рассуждаю логически -- если функция this.document.foo каким-то образом вызывается, значит, this.document != null и потому внутри ее проверять такие щмотки бессмысленно. Ругая маму индуса зачавшего этот код, удаляю прверку на фиг. И что же? IE вываливает ошибку, что this.document нуль или не объект. Пишу alert(typeof this.document) и он пишет object.
Но этот объект равен нулю!!! Ээээ... минуточку, а как же тогда this.document.foo вызывается?! А ведь вызывается, зараза. После нецензурного траха с отладчиком и дизассемблером, выясняю, что foo (которая в реальном коде совсем не foo) совпадет с одним из имеющихся build-in имен и IE запоминает прямой указатель на нее, идущий в обход this.document (типа оптимизация такая). И вот какой-то другой зловредный скрпт устанавливает document в null, ожидая получить исключение на вызове this.document.foo, но реально оно выпрыгивает на вызове this.document.bar внутри this.document.foo.
Ахренеть, какая логика оптимизации. Уже молчу за неочевидность необходимости префикса this. без которого зловредный скрипт может захчаить trusted скрипит, изменив объект по умолчанию на свой объект.
Вот такой индуский-неиндусский код.