Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Событие вызова функции (https://javascript.ru/forum/project/24101-sobytie-vyzova-funkcii.html)

FINoM 19.12.2011 02:33

Цитата:

Сообщение от x-yuri
ok, приведу пример ближе к твоему варианту: http://jsfiddle.net/EFmw6/1/

Там всё то же присваивание. Было бы интересно сделать что-то типа такого:

f = function(){
...
}

f.attachCallListener(function{
...
})

f(); //а здесь уже вызывается функция и обработчик
Цитата:

Сообщение от x-yuri
ты создаешь средства отладки, которые не лучше уже имеющихся (firebug, например) или не расширяющие их значительно

А как это потесняет отладчики (или наоборот)?
А можешь, не меняя кода функции, посмотреть, сколько раз и как она вызывалась?

Цитата:

Сообщение от trikadin
Чтобы не мешать код в кучу. Мухи - отдельно, котлеты - отдельно.

Цитата:

Сообщение от x-yuri
это временный код, ты его должен удалить в результате

Точно.

Nekromancer 19.12.2011 03:02

А я бы сделал так:
window.callEvent = function(func, callback){
		return function(){
			var args = Array.prototype.slice.call(arguments);
			var result;
			try {
				result = func.apply(this, arguments); 
			} catch (e) {
				if(callback(e, args, this) !== false) throw e;
			}
			callback(result, args, this);
			return result;				 
		}
	}


FINoM,
Вам бы почитать про Proxy. v8 и SpiderMonkey вполне себе поддерживают.

П.С. Вообще где то на хабре это уже было :)

trikadin 19.12.2011 03:04

Цитата:

Сообщение от Nekromancer
Вам бы почитать про Proxy.

И мне тогда тоже) Пробежался, выглядит интересно)

Nekromancer 19.12.2011 03:10

trikadin,
Кстати там в самом низу есть ссылки на презентацию Брендана Эйча. Сам ещё не смотрел, но надо бы посмотреть :)

trikadin 19.12.2011 03:25

Цитата:

Сообщение от Nekromancer
Кстати там в самом низу есть ссылки на презентацию Брендана Эйча. Сам ещё не смотрел, но надо бы посмотреть

Не осилил ещё до конца) Всё же мой английский пока не идеален)

x-yuri 19.12.2011 06:02

Цитата:

Сообщение от FINoM
Там всё то же присваивание. Было бы интересно сделать что-то типа такого:

f = function(){
...
}

f.attachCallListener(function{
...
})

f(); //а здесь уже вызывается функция и обработчик

ты понимаешь, что attachCallListener надо вставить сразу же после определения f, иначе ты можешь пропустить вызов f? А это значит, что ну пусть ты не изменил код функции, но ты должен изменить код рядом с функцией. А о выносе в другой файл вообще речи не должно быть, по-крайней мере в данной абстрактной ситуации. Так что на практике ты к тому же усложняешь себе жизнь тем, что тебе надо думать, в каком месте можно обернуть функцию, чтобы ничего не пропустить.

потом, даже если бы можно было сделать как ты хочешь, как бы это выглядело? Что-то типа jquery.live?
$('/js/script.js:1:f').live(function() {...});

Как указать вызов какой именно функции надо перехватывать?

Цитата:

Сообщение от FINoM
А как это потесняет отладчики (или наоборот)?
А можешь, не меняя кода функции, посмотреть, сколько раз и как она вызывалась?

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

Цитата:

Сообщение от FINoM
А как это потесняет отладчики (или наоборот)?

в том-то и дело, что никак

Цитата:

Сообщение от FINoM
А можешь, не меняя кода функции, посмотреть, сколько раз и как она вызывалась?

я не знаю, зачем мне это. Все о чем ты говоришь я могу сделать с помощью console.log. Причем я смогу вывести именно тот вариант "как она вызывалась", который мне нужен, а не какой-то универсальный. Я ж так понял, что вывод "как она вызывалась" - это одна из задач твоего инструмента?

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

melky 19.12.2011 09:14

Цитата:

Сообщение от Nekromancer (Сообщение 144324)
Брендана Эйча.

Айка. ай-ай-ай.

Nekromancer 19.12.2011 10:19

melky,
ага, стыдно )

FINoM 22.12.2011 02:54

Немного расширил функцию: теперь вместо одного колбека вторым аргументом передается объект
  • before (вызывается перед запуском функции)
  • success (вызывается, если функция отработала успешно)
  • error (если возникла ошибка)
  • after (вызывается в любом случае, не зависимо от успешности выполнения)
Каждому обработчику передается объект
  • args
  • self (контекст)
  • name (имя функции)
  • status ("error" или "success")
  • successNumber (количество успешных вызовов)
  • errorNumber (количество вызовов с ошибкой)
  • result (результат, если есть)
  • error (ошибка, если есть)
Кроме этого, функция addCallListener теперь является частью объекта конструктора Function, во избежание попадания в window или process.

Форкнуть и потестить можно здесь: http://jsfiddle.net/finom/SGhzd/5/


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