Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как повесить обработчик на событие "вызов функции"? (https://javascript.ru/forum/misc/13793-kak-povesit-obrabotchik-na-sobytie-vyzov-funkcii.html)

stopkran 14.12.2010 08:11

Как повесить обработчик на событие "вызов функции"?
 
Догадываюсь, что это "идеологически невозможно". В более общем плане задача такая: вызывается по очереди несколько функций, хочу измерить время работы каждой. Сейчас делаю так:

function func (){
    var d0 = new Date()
    <тело функции>
    addLog("func: ", d0)
}


Первое упрощение могло бы быть примерно таким: в конце исполняемой функции вызывать addLog() без параметров, а параметры - d0 и имя исполняемой функции получать внутри addLog(). Возможно ли это?

Второе (и третье): можно ли в javascript сделать так, чтобы при вызове любой функции всегда срабатывала ещё одна определённая функция? Или, например, чтобы при вызове любой функции значение (пусть глобальной) переменной d0 устанавливалось в new Date()?

B@rmaley.e><e 14.12.2010 09:46

Если стоит задача измерять время работы функции, то создайте функцию-обертку для замеров.
function profiling(fnc){
  var start = new Date;
  fnc();
  return {fnc: fnc.name, time: new Date - start};
}

stopkran 15.12.2010 09:17

Цитата:

Сообщение от B@rmaley.e><e
return {fnc: fnc.name, time: new Date - start};

не получается: у моих функций почему-то нет свойства name

e1f 15.12.2010 14:15

Оно есть вроде бы только в FF

Kolyaj 15.12.2010 14:58

Оно есть везде, если оно указано. У анонимных функций его, как ни странно, нет.

e1f 15.12.2010 15:24

Opera 10.63 есть, IE 8 нет.

Kolyaj 15.12.2010 16:06

Дада, в IE "баг". Там имя функции можно из func.toString() вытащить.

stopkran 16.12.2010 09:27

Цитата:

Сообщение от Kolyaj
У анонимных функций его, как ни странно, нет.

Значит, обёртка (типа предлагаемой Бармалеем) для анонимных функций принципиально невозможна?

monolithed 16.12.2010 10:36

А объясните мне, почему это свойство в нижеприведенном контексте выводит название iframe'a?
(function foo(){alert(name)})();

x-yuri 16.12.2010 10:53

Цитата:

Сообщение от stopkran
Значит, обёртка (типа предлагаемой Бармалеем) для анонимных функций принципиально невозможна?

как сказали выше, возможна

Цитата:

Сообщение от monolithed
А объясните мне, почему это свойство в нижеприведенном контексте выводит название iframe'a?

а что оно по-твоему должно выводить?

Kolyaj 16.12.2010 11:16

name == window.name

monolithed 16.12.2010 11:20

Цитата:

Сообщение от x-yuri
а что оно по-твоему должно выводить?

мне еще ни разу не приходилось использовать это свойство в работе, да и в справочниках я не нашел его описания, поэтому и присутствует недопонимание.

Kolyaj а где можно его описание почитать?

exec 16.12.2010 11:30

http://javascript.ru/window.name

Sweet 16.12.2010 11:46

monolithed,
наверное вы хотели увидеть это:
(function foo(){alert(arguments.callee.name)})();
?:)

monolithed 16.12.2010 12:02

Цитата:

Сообщение от exec
http://javascript.ru/window.name

спс, а я искал))

Цитата:

Сообщение от Sweet
наверное вы хотели увидеть это:

не, ну это я конечно ожидал)) просто до конца надеялся что это свойство не ссылается на Window

monolithed 16.12.2010 12:21

На самом деле тогда уж так:

(function foo(){
    alert(/\s\w+/.exec(arguments.callee.toString())[0]);
})();

(function(){
    alert(/\s\w+/.exec(arguments.callee.toString())[0]);
})();

Kolyaj 16.12.2010 12:22

monolithed,
во втором случае фэйл.

exec 16.12.2010 12:23

(function тратата(){
    alert(/\s\w+/.exec(arguments.callee.toString())[0])
})();


Всякое ведь бывает.

monolithed 16.12.2010 12:28

Для объекта
var object = {
    name: function() {
        for(var i in object) {
            if(object[i] == arguments.callee.toString()) {
                alert(i);
                break;
            }
        }
    }
};

object.name();

x-yuri 16.12.2010 19:14

Цитата:

Сообщение от monolithed
не, ну это я конечно ожидал)) просто до конца надеялся что это свойство не ссылается на Window

оно и не ссылается на window. Просто когда ты писал name - первый name, который он нашел был в window. А когда ты уточнил, где name искать, он выдал имя функции

Sweet 16.12.2010 19:39

Цитата:

Сообщение от monolithed
Для объекта

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

stopkran 18.12.2010 06:57

где конструктор?
 
Это всё здорово, но ("почему же все того, как в рот набрали?") вот раз в жизни (в кои-то веки!) человеку понадобился конструктор класса, а специалисты по ООП упрямо молчат. Я, если честно, ожидал увидеть чего-то вроде:

http://code.google.com/p/jsxt/source...s/Benchmark.js

Ну, теперь уже сам нашёл... Правда, он у меня всё равно ни хрена не работает! :-) Разберусь, и напишу куда следует (статаью).

Kolyaj 18.12.2010 07:54

Цитата:

Сообщение от stopkran
Это всё здорово, но ("почему же все того, как в рот набрали?") вот раз в жизни (в кои-то веки!) человеку понадобился конструктор класса, а специалисты по ООП упрямо молчат.

stopkran,
вы о чём? Какой конструктор? Какое ООП?

stopkran 18.12.2010 09:51

ээ...Kolyaj - это один человек, или под этим ником пишет группа лиц, не обязательно знающих друг о друге?

Kolyaj 18.12.2010 10:24

Я-то один, а вот вас сколько, это интересно. Ибо к чему написано сообщение #22 -- непонятно.

with-love-from-siberia 18.12.2010 17:27

Цитата:

Сообщение от stopkran (Сообщение 84242)
... если честно, ожидал увидеть чего-то вроде:

http://code.google.com/p/jsxt/source...s/Benchmark.js

Ну, теперь уже сам нашёл... Правда, он у меня всё равно ни хрена не работает! :-) Разберусь, и напишу куда следует (статаью).

Статья, описывающая приведенный код, уже существует. У Вас какие проблемы? Вы не смогли применить описанное? Задавайте свои вопросы. Я иногда появляюсь здесь - готов ответить на них.

stopkran 24.12.2010 09:46

Цитата:

Сообщение от with-love-from-siberia
Статья, описывающая приведенный код, уже существует

Наверное, на dklab.ru? Я через неё и нашёл скрипт. Проблема такая: функции, скорость которых надо измерять, находятся внутри конструкции (function (){})(). И benchmark не работает, говорит: "1 is not function" или что-то в этом роде (точная цитата - в обещанной статье http://ir2.ru/benchmark.aspx).

Но это полбеды. Гораздо хуже - отсутствие у функций свойства 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
}

with-love-from-siberia 24.12.2010 14:50

Вы правы - внутри не работает. Сейчас быстренько проверил в jscript. Если у Вас хоть что-то выводит, у меня было молчание. Когда-нибудь я вернусь к этому файлу и посмотрю в чем дело.

Поправьте в своей статье ссылку на правильный источник.

stopkran 29.12.2010 08:04

Нет, в jscript я не пробовал, было достаточно и того, что в ФФ не работает. Да, видимо, и не должно в принципе работать. Не всё можно совместить.

Моя ссылка ведёт на стр. http://with-love-from-siberia.blogsp...bel/javascript, там есть статья о вашем benchmark (правда, на английском). Я не понял, как лучше изменить эту ссылку. Дайте предпочитаемый адрес, и я исправлю.

with-love-from-siberia 29.12.2010 10:37

По указанной Вами ссылке - первая статья снизу на русском.

stopkran 01.01.2011 09:11

Исправил. Вроде, получилось.


Часовой пояс GMT +3, время: 19:16.