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

в 17:04, , рубрики: 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 ) );
	}
}  ()  );

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

Автор: tramak

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js