Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #31 (permalink)  
Старый 19.12.2011, 02:33
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Сообщение от x-yuri
ok, приведу пример ближе к твоему варианту: http://jsfiddle.net/EFmw6/1/
Там всё то же присваивание. Было бы интересно сделать что-то типа такого:

f = function(){
...
}

f.attachCallListener(function{
...
})

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

Сообщение от trikadin
Чтобы не мешать код в кучу. Мухи - отдельно, котлеты - отдельно.
Сообщение от x-yuri
это временный код, ты его должен удалить в результате
Точно.
Ответить с цитированием
  #32 (permalink)  
Старый 19.12.2011, 03:02
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

А я бы сделал так:
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 вполне себе поддерживают.

П.С. Вообще где то на хабре это уже было
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #33 (permalink)  
Старый 19.12.2011, 03:04
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Сообщение от Nekromancer
Вам бы почитать про Proxy.
И мне тогда тоже) Пробежался, выглядит интересно)
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #34 (permalink)  
Старый 19.12.2011, 03:10
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

trikadin,
Кстати там в самом низу есть ссылки на презентацию Брендана Эйча. Сам ещё не смотрел, но надо бы посмотреть
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #35 (permalink)  
Старый 19.12.2011, 03:25
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Сообщение от Nekromancer
Кстати там в самом низу есть ссылки на презентацию Брендана Эйча. Сам ещё не смотрел, но надо бы посмотреть
Не осилил ещё до конца) Всё же мой английский пока не идеален)
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #36 (permalink)  
Старый 19.12.2011, 06:02
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

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

f.attachCallListener(function{
...
})

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

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

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

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

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

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

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

если же эта задача представляет академический, а не практический интерес, тогда у меня нету вопросов. Не вижу в этом ничего плохого. Но и интерес к ней у меня тогда автоматически пропадает.
Ответить с цитированием
  #37 (permalink)  
Старый 19.12.2011, 09:14
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Nekromancer Посмотреть сообщение
Брендана Эйча.
Айка. ай-ай-ай.
Ответить с цитированием
  #38 (permalink)  
Старый 19.12.2011, 10:19
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

melky,
ага, стыдно )
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #39 (permalink)  
Старый 22.12.2011, 02:54
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

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

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

Последний раз редактировалось FINoM, 22.12.2011 в 03:15.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сформировать URL для вызова функции klingan Общие вопросы Javascript 13 25.04.2013 20:55
Почему происходит проверка до вызова самой функции? wwwboy Общие вопросы Javascript 5 09.12.2011 03:37
Вставка элемента в место вызова функции belkir Элементы интерфейса 21 05.08.2011 08:59
запуск функции через событие radio DmitryT Элементы интерфейса 5 05.03.2011 10:26
Строка вызова функции DMH Общие вопросы Javascript 11 10.08.2010 09:06