Как повесить обработчик на событие "вызов функции"?
Догадываюсь, что это "идеологически невозможно". В более общем плане задача такая: вызывается по очереди несколько функций, хочу измерить время работы каждой. Сейчас делаю так:
function func (){ var d0 = new Date() <тело функции> addLog("func: ", d0) } Первое упрощение могло бы быть примерно таким: в конце исполняемой функции вызывать addLog() без параметров, а параметры - d0 и имя исполняемой функции получать внутри addLog(). Возможно ли это? Второе (и третье): можно ли в javascript сделать так, чтобы при вызове любой функции всегда срабатывала ещё одна определённая функция? Или, например, чтобы при вызове любой функции значение (пусть глобальной) переменной d0 устанавливалось в new Date()? |
Если стоит задача измерять время работы функции, то создайте функцию-обертку для замеров.
function profiling(fnc){ var start = new Date; fnc(); return {fnc: fnc.name, time: new Date - start}; } |
Цитата:
|
Оно есть вроде бы только в FF
|
Оно есть везде, если оно указано. У анонимных функций его, как ни странно, нет.
|
Opera 10.63 есть, IE 8 нет.
|
Дада, в IE "баг". Там имя функции можно из func.toString() вытащить.
|
Цитата:
|
А объясните мне, почему это свойство в нижеприведенном контексте выводит название iframe'a?
(function foo(){alert(name)})(); |
Цитата:
Цитата:
|
name == window.name |
Цитата:
Kolyaj а где можно его описание почитать? |
|
monolithed,
наверное вы хотели увидеть это: (function foo(){alert(arguments.callee.name)})();?:) |
Цитата:
Цитата:
|
На самом деле тогда уж так:
(function foo(){ alert(/\s\w+/.exec(arguments.callee.toString())[0]); })(); (function(){ alert(/\s\w+/.exec(arguments.callee.toString())[0]); })(); |
monolithed,
во втором случае фэйл. |
(function тратата(){ alert(/\s\w+/.exec(arguments.callee.toString())[0]) })(); Всякое ведь бывает. |
Для объекта
var object = { name: function() { for(var i in object) { if(object[i] == arguments.callee.toString()) { alert(i); break; } } } }; object.name(); |
Цитата:
|
Цитата:
var object = { another: function() { for(var i in object) { if(object[i] == arguments.callee.toString()) { alert(i); break; } } }, name: function() { for(var i in object) { if(object[i] == arguments.callee.toString()) { alert(i); break; } } } }; object.name(); |
где конструктор?
Это всё здорово, но ("почему же все того, как в рот набрали?") вот раз в жизни (в кои-то веки!) человеку понадобился конструктор класса, а специалисты по ООП упрямо молчат. Я, если честно, ожидал увидеть чего-то вроде:
http://code.google.com/p/jsxt/source...s/Benchmark.js Ну, теперь уже сам нашёл... Правда, он у меня всё равно ни хрена не работает! :-) Разберусь, и напишу куда следует (статаью). |
Цитата:
вы о чём? Какой конструктор? Какое ООП? |
ээ...Kolyaj - это один человек, или под этим ником пишет группа лиц, не обязательно знающих друг о друге?
|
Я-то один, а вот вас сколько, это интересно. Ибо к чему написано сообщение #22 -- непонятно.
|
Цитата:
|
Цитата:
Но это полбеды. Гораздо хуже - отсутствие у функций свойства name в ИЕ. Я нашёл только такой способ обойти её: Функцию makeThead() с параметром t вызывать так: fixTime(window, "makeThead", t) А сама функция fixTime будет примерно такой: function fixTime() { var d1, d0 = new Date(), ret, i, obj = arguments[0], f = arguments[1], args = Array.prototype.slice.call(arguments, 2) obj = obj || window if (!(f in obj) || typeof obj[f] !== 'function') return ret = obj[f].apply(this, args) d1 = new Date() Log(d1 – d0, f) return ret } |
Вы правы - внутри не работает. Сейчас быстренько проверил в jscript. Если у Вас хоть что-то выводит, у меня было молчание. Когда-нибудь я вернусь к этому файлу и посмотрю в чем дело.
Поправьте в своей статье ссылку на правильный источник. |
Нет, в jscript я не пробовал, было достаточно и того, что в ФФ не работает. Да, видимо, и не должно в принципе работать. Не всё можно совместить.
Моя ссылка ведёт на стр. http://with-love-from-siberia.blogsp...bel/javascript, там есть статья о вашем benchmark (правда, на английском). Я не понял, как лучше изменить эту ссылку. Дайте предпочитаемый адрес, и я исправлю. |
По указанной Вами ссылке - первая статья снизу на русском.
|
Исправил. Вроде, получилось.
|
Часовой пояс GMT +3, время: 19:16. |