Конкатинация функций на javascript

от автора

Перед выполнением каких либо действий над элементами их сначала требуется найти, например:

function show() { 	var block  = $( this ); 	var input = block.find( 'input' ); 	var elem = block.find( '.elem' );  	input.val( 1 ); 	elem.slideDown(); }  function hide() { 	var block  = $( this ); 	var input = block.find( 'input' ); 	var elem = block.find( '.elem' );  	input.val( 0 ); 	elem.slideUp(); } 

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

function base() { 	var block  = $( this ); 	var input = block.find( 'input' ); 	var elem = block.find( '.elem' ); }  show = concatf( base, function() { 	input.val( 1 ); 	elem.slideDown(); } );  hide = concatf( base, function() { 	input.val( 0 ); 	elem.slideUp(); } ); 

Ну и собственно реализация функции concatf:

var concatf = ( function() { 	function r( f ) { 		return f.toString().replace( /^[^{]+{/, '' ).replace( /[^}]}$/, '' ); 	} 	 	return function( f1, f2 ) { 		return new Function( f2.toString().match( /\(([^)]*)\)/ )[ 1 ].replace( /\s/g, '' ), r( f1 ) + r( f2 ) ); 	} }  ()  ); 

В данной реализации есть большой минус, это потеря замыкания.
Эту проблему можно решить, но больно не красиво, поэтому приводить реализацию не буду.

ссылка на оригинал статьи http://habrahabr.ru/post/184368/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *