Javascript.RU

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

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

(function(){
	window.callEvent = function(func, callback){
		var callNumber = 0;
		return function(){
			var args = [].slice.call(arguments);
			var result;
			try {
				result = func.apply(this, arguments);
				callNumber++;
			} catch (e) {
				callback(e, args, this, callNumber);
				throw e;
			}
			callback(result, args, this, callNumber);
			return result;				 
		}
	}
	
	var logSomething = function(something){
		console.log(something);
	}
	
	logSomething = callEvent(logSomething, function(result, args, self, callNumber){
		console.log('alertSomething has been called. \n\
			Result is ' + result + '. \n\
			Arguments are ' + args + '. \n\
			Self is ' + self + '. \n\
			Number of calls ' + callNumber + '. \n'
		);
	});
	
	Array.prototype.push = callEvent(Array.prototype.push, function(result, args, self, callNumber){
		console.log('Array.prototype.push has been called. \n\
			Result is ' + result + '. \n\
			Arguments are ' + args + '. \n\
			Self is ' + self);
	});
	
	logSomething('Fuck yeah!');
	logSomething('Fuck yeah!');
	logSomething('Fuck yeah!');
	logSomething('Fuck yeah!');
	logSomething('Fuck yeah!');
	
	var array = [1,2,3,4,5];
	array.push(6);
})();

Последний раз редактировалось FINoM, 18.12.2011 в 07:30.
Ответить с цитированием
  #2 (permalink)  
Старый 17.12.2011, 23:49
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Сообщение от FINoM
var func2 = func;
Ненужная строка. И простого func хватит.
Ответить с цитированием
  #3 (permalink)  
Старый 17.12.2011, 23:51
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

B@rmaley.e><e, точно, спасибо.
Ответить с цитированием
  #4 (permalink)  
Старый 18.12.2011, 00:44
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Только вот не могу придумать, как это сделать через Function.prototype.
Ответить с цитированием
  #5 (permalink)  
Старый 18.12.2011, 01:21
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

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

Не совсем понимаю о чем ты. Кинул исключение, всё остановилось. И что?
Ответить с цитированием
  #7 (permalink)  
Старый 18.12.2011, 01:44
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Сообщение от FINoM
Только вот не могу придумать, как это сделать через Function.prototype.
Переопределить?
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #8 (permalink)  
Старый 18.12.2011, 01:49
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Сообщение от trikadin
Переопределить?
Э, как?
Function.prototype.callEvent = function(callback){
	this = function(){...
Выкидывает исключение.
Ответить с цитированием
  #9 (permalink)  
Старый 18.12.2011, 01:54
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Сообщение от FINoM
Выкидывает исключение.
Естественно. Изменить this из метода нельзя. В данном случае можно будет только вернуть новую функцию, для которой будет назначен соответствующий обработчик.
Ответить с цитированием
  #10 (permalink)  
Старый 18.12.2011, 02:03
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Сообщение от B@rmaley.e><e
Естественно. Изменить this из метода нельзя. В данном случае можно будет только вернуть новую функцию, для которой будет назначен соответствующий обработчик.
Я говорю о том, чтобы при создании ф-ции добавлять к ней коллбек и способ добавления новых коллбеков. Путем сохранения Function в переменную и переопределения его. Вряд ли это реально, но это просто идея.
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сформировать 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