Начиная с версии 1.2 в языке JavaScript есть интересный метод работы с функциями -
arguments.callee. Откроем почитать документацию.
arguments.callee
Специфицирует тело исполняемой в данный момент функции. Свойство callee доступно только в теле функции. Ключевое слово this не относится к исполняемой в данный момент функции. Используйте свойство callee для обращения к функции в теле этой функции.
Проще говоря, результатом выполнения
arguments.callee внутри какой-нибудь функции будет тело этой функции. Для наглядного примера код:
function myFunc() {
return arguments.callee;
}
alert(myFunc());
покажет в MessageBox'е следующее:

Результат arguments.callee
то есть в точности код вызванной функции. "Ага!" - подумали суровые уральские мужики. - "А если мы поместим в тело функции что-нибудь еще, например железный лом комментарий?" Подумали и поместили.
function myFunc() {
// Today is a good day to die
return arguments.callee;
}
alert(myFunc());
Тестирование приведенного кода в разных браузерах показало очень интересный результат. Mozilla Firefox, Safari, K-Meleon, Netscape Navigator и Opera до версии 9.5 показывают код функции БЕЗ комментариев, а Internet Explorer версий 6-7 и Opera 9.5 и выше добросовестно показывают полный текст функции со всеми комментариями. А не попробовать ли нам использовать это поведение браузеров для определения их типов? В результате недолгих раздумий появилась следующая функция:
function detect_ie() {
function smart_ie_check() {
// 66 - Internet Explorer Trap
return(arguments.callee.toString().replace(/[^6]/g,''));
}
return(smart_ie_check()=='666' && typeof(opera)!='object');
}
Вложенная функция
smart_ie_check() возвращает свое тело, из которого вырезаны все символы, не являющиеся цифрой "6". Напомню, что в Internet Explorer в обрабатываемую строку попадает и комментарий. Результатом работы
smart_ie_check() будет "666" для IE-based браузеров и Opera 9.5+, а для всех остальных браузеров вернется "6". Откуда взялись эти "шестерки"? Две из комментария и одна из фильтра
replace, итого три. Остается отфильтровать из результатов Opera, для этого проверим тип объекта "opera". В браузерах семейства Opera этот объект является внутренним и определен собственно как "object", в других браузерах вернется "undefined". После всех проверок функция
detect_ie() вернет
true, если браузер Internet Explorer или IE-based и
false для всех остальных браузеров.
Разумеется, полагаться только на эту проверку при определении типа браузера нежелательно, она должна быть использована только как часть комплексной проверки. Но все-таки такая проверка гораздо надежнее чем поиск строки "MSIE" в
navigator.userAgent, потому что существует множество программ и плагинов для "камуфляжа" браузеров под совершенно другие.