Funkce JavaScriptu, které vracejí funkce

Před několika týdny jsem tweetoval, že miluji funkce, které vracejí funkce. Dostal jsem docela dost odpovědí na melodii....WTF?! Je důležité, aby lidé chápali hodnotu funkcí, které vracejí funkce; použití této techniky vám může ušetřit kód, efektivitu JavaScriptu a získané znalosti o tom, jak mocný JavaScript může být. Vytvořil jsem rychlý příklad, který bych vám rád ukázal, abyste získali představu, kterou jsem se snažil komunikovat.

Řekněme, že máte jeden hostitelský objekt se dvěma podřízenými objekty, oba s get metody a obě to dělají přesně stejný úkol, ale s jiným atributem:

var accessors = {
	sortable: {
		get: function() {
			return typeof this.getAttribute('sortable') != 'undefined';
		}
	},
	droppable: {
		get: function() {
			return typeof this.getAttribute('droppable') != 'undefined';
		}
	}
};

Opakování stejného kódu není ideální, takže bychom mohli vytvořit jednu externí funkci a předat jí argument atributu:

function getAttribute(attr) {
	return typeof this.getAttribute(attr) != 'undefined';
}
 
var accessors = {
	sortable: {
		get: function() {
			return getAttribute('sortable');
		}
	},
	droppable: {
		get: function() {
			return getAttribute('droppable');
		}
	}
};

To je mnohem lepší, ale stále to není ideální, protože pokaždé, když je metoda volána, existuje další, mezilehlá funkce. Nejlépe by fungovala funkce, která by vracela konečnou funkci  – což by eliminovalo spouštění další funkce při každém volání, které má získat:

function generateGetMethod(attr) {
	return function() {
		return typeof this.getAttribute(attr) != 'undefined';
	};
}
 
var accessors = {
	sortable: {
		get: generateGetMethod('sortable')
	},
	droppable: {
		get: generateGetMethod('droppable')
	}
};

/* functional equivalent to the original code:

var accessors = {
	sortable: {
		get: function() {
			return typeof this.getAttribute('sortable') != 'undefined';
		}
	},
	droppable: {
		get: function() {
			return typeof this.getAttribute('droppable') != 'undefined';
		}
	}
};

*/

To, co vidíte výše, je funkce vracející funkci; každá metoda má svou vlastní metodu pro získání vlastnosti a na každou get nevzniká žádná režie zavolejte.

Toto je opravdu užitečná technika, která vám ušetří opakování podobného kódu a při správném použití je snadno pochopitelná a udržovatelná!